1  /*
2   * Copyright (c) 2021-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 "window_manager_service.h"
17  
18  #include <thread>
19  
20  #include <ability_manager_client.h>
21  #include <cinttypes>
22  #include <chrono>
23  #include <hisysevent.h>
24  #include <hitrace_meter.h>
25  #include <ipc_skeleton.h>
26  #include <parameters.h>
27  #include <rs_iwindow_animation_controller.h>
28  #include "scene_board_judgement.h"
29  #include <system_ability_definition.h>
30  #include <sstream>
31  #include "xcollie/watchdog.h"
32  
33  #include "color_parser.h"
34  #include "display_manager_service_inner.h"
35  #include "dm_common.h"
36  #include "drag_controller.h"
37  #include "memory_guard.h"
38  #include "minimize_app.h"
39  #include "permission.h"
40  #include "persistent_storage.h"
41  #include "remote_animation.h"
42  #include "singleton_container.h"
43  #include "starting_window.h"
44  #include "ui/rs_ui_director.h"
45  #include "window_helper.h"
46  #include "window_inner_manager.h"
47  #include "window_layout_policy.h"
48  #include "window_manager_agent_controller.h"
49  #include "window_manager_hilog.h"
50  #include "wm_common.h"
51  #include "wm_math.h"
52  
53  namespace OHOS {
54  namespace Rosen {
55  namespace {
56  constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WMS"};
57  }
58  WM_IMPLEMENT_SINGLE_INSTANCE(WindowManagerService)
59  
60  const bool REGISTER_RESULT = SceneBoardJudgement::IsSceneBoardEnabled() ? false :
61      SystemAbility::MakeAndRegisterAbility(&SingletonContainer::Get<WindowManagerService>());
62  const std::string BOOTEVENT_WMS_READY = "bootevent.wms.ready";
63  
WindowManagerService()64  WindowManagerService::WindowManagerService() : SystemAbility(WINDOW_MANAGER_SERVICE_ID, true),
65      rsInterface_(RSInterfaces::GetInstance()),
66      windowShowPerformReport_(new PerformReporter("SHOW_WINDOW_TIME", {20, 35, 50}))
67  {
68      windowRoot_ = new WindowRoot(
__anon02364d230202(Event event, const sptr<IRemoteObject>& remoteObject) 69          [this](Event event, const sptr<IRemoteObject>& remoteObject) { OnWindowEvent(event, remoteObject); });
70      inputWindowMonitor_ = new InputWindowMonitor(windowRoot_);
71      windowController_ = new WindowController(windowRoot_, inputWindowMonitor_);
72      dragController_ = new DragController(windowRoot_);
73      windowDumper_ = new WindowDumper(windowRoot_);
74      freezeDisplayController_ = new FreezeController();
75      windowCommonEvent_ = std::make_shared<WindowCommonEvent>();
76      startingOpen_ = system::GetParameter("persist.window.sw.enabled", "1") == "1"; // startingWin default enabled
77      windowGroupMgr_ = new WindowGroupMgr(windowRoot_);
78      if (SceneBoardJudgement::IsSceneBoardEnabled()) {
79          return;
80      }
81      runner_ = AppExecFwk::EventRunner::Create(name_);
82      handler_ = std::make_shared<AppExecFwk::EventHandler>(runner_);
83      snapshotController_ = new SnapshotController(windowRoot_, handler_);
84      int ret = HiviewDFX::Watchdog::GetInstance().AddThread(name_, handler_);
85      if (ret != 0) {
86          WLOGFE("Add watchdog thread failed");
87      }
__anon02364d230302() 88      handler_->PostTask([]() { MemoryGuard cacheGuard; }, "WindowManagerService:cacheGuard", 0,
89          AppExecFwk::EventQueue::Priority::IMMEDIATE);
90      // init RSUIDirector, it will handle animation callback
91      rsUiDirector_ = RSUIDirector::Create();
__anon02364d230402(const std::function<void()>& task, uint32_t delay) 92      rsUiDirector_->SetUITaskRunner([this](const std::function<void()>& task, uint32_t delay) {
93          PostAsyncTask(task, "WindowManagerService:cacheGuard", delay);
94      });
95      rsUiDirector_->Init(false);
96  }
97  
OnStart()98  void WindowManagerService::OnStart()
99  {
100      WLOGI("start");
101      if (!Init()) {
102          WLOGFE("Init failed");
103          return;
104      }
105      WindowInnerManager::GetInstance().Start(system::GetParameter("persist.window.holder.enable", "0") == "1");
106      WindowInnerManager::GetInstance().StartWindowInfoReportLoop();
107      WindowInnerManager::GetInstance().SetWindowRoot(windowRoot_);
108      sptr<IDisplayChangeListener> listener = new DisplayChangeListener();
109      DisplayManagerServiceInner::GetInstance().RegisterDisplayChangeListener(listener);
110  
111      sptr<IWindowInfoQueriedListener> windowInfoQueriedListener = new WindowInfoQueriedListener();
112      DisplayManagerServiceInner::GetInstance().RegisterWindowInfoQueriedListener(windowInfoQueriedListener);
113      system::SetParameter(BOOTEVENT_WMS_READY.c_str(), "true");
114      AddSystemAbilityListener(RENDER_SERVICE);
115      AddSystemAbilityListener(ABILITY_MGR_SERVICE_ID);
116      AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
117      sptr<WindowManagerService> wms = this;
118      wms->IncStrongRef(nullptr);
119      if (!Publish(sptr<WindowManagerService>(this))) {
120          WLOGFE("Publish failed");
121      }
122      WLOGI("end");
123  }
124  
PostAsyncTask(Task task,const std::string & taskName,uint32_t delay)125  void WindowManagerService::PostAsyncTask(Task task, const std::string& taskName, uint32_t delay)
126  {
127      if (handler_) {
128          bool ret = handler_->PostTask(task, "wms:" + taskName, delay, AppExecFwk::EventQueue::Priority::IMMEDIATE);
129          if (!ret) {
130              WLOGFE("EventHandler PostTask Failed");
131          }
132      }
133  }
134  
PostVoidSyncTask(Task task,const std::string & taskName)135  void WindowManagerService::PostVoidSyncTask(Task task, const std::string& taskName)
136  {
137      if (handler_) {
138          bool ret = handler_->PostSyncTask(task, "wms:" + taskName, AppExecFwk::EventQueue::Priority::IMMEDIATE);
139          if (!ret) {
140              WLOGFE("EventHandler PostVoidSyncTask Failed");
141          }
142      }
143  }
144  
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)145  void WindowManagerService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
146  {
147      WLOGI("systemAbilityId: %{public}d, start", systemAbilityId);
148      switch (systemAbilityId) {
149          case RENDER_SERVICE:
150              WLOGI("RENDER_SERVICE");
151              InitWithRanderServiceAdded();
152              break;
153          case ABILITY_MGR_SERVICE_ID:
154              WLOGI("ABILITY_MGR_SERVICE_ID");
155              InitWithAbilityManagerServiceAdded();
156              break;
157          case COMMON_EVENT_SERVICE_ID:
158              WLOGI("COMMON_EVENT_SERVICE_ID");
159              windowCommonEvent_->SubscriberEvent();
160              break;
161          case MULTIMODAL_INPUT_SERVICE_ID:
162              WLOGI("MULTIMODAL_INPUT_SERVICE_ID");
163              SetWindowInputEventConsumer();
164              break;
165          default:
166              WLOGFW("unhandled sysabilityId: %{public}d", systemAbilityId);
167              break;
168      }
169      WLOGI("systemAbilityId: %{public}d, end", systemAbilityId);
170  }
171  
SetWindowInputEventConsumer()172  void WindowManagerService::SetWindowInputEventConsumer()
173  {
174      WindowInnerManager::GetInstance().SetInputEventConsumer();
175  }
176  
OnAccountSwitched(int accountId)177  void WindowManagerService::OnAccountSwitched(int accountId)
178  {
179      auto task = [this, accountId]() {
180          windowRoot_->RemoveSingleUserWindowNodes(accountId);
181      };
182      PostAsyncTask(task, "OnAccountSwitched");
183      WLOGI("called");
184  }
185  
WindowVisibilityChangeCallback(std::shared_ptr<RSOcclusionData> occlusionData)186  void WindowManagerService::WindowVisibilityChangeCallback(std::shared_ptr<RSOcclusionData> occlusionData)
187  {
188      WLOGI("NotifyWindowVisibilityChange: enter");
189      std::weak_ptr<RSOcclusionData> weak(occlusionData);
190      auto task = [this, weak]() {
191          auto weakOcclusionData = weak.lock();
192          if (weakOcclusionData == nullptr) {
193              WLOGFE("weak occlusionData is nullptr");
194              return;
195          }
196          windowRoot_->NotifyWindowVisibilityChange(weakOcclusionData);
197      };
198      PostVoidSyncTask(task, "WindowVisibilityChangeCallback");
199  }
200  
InitWithRanderServiceAdded()201  void WindowManagerService::InitWithRanderServiceAdded()
202  {
203      auto windowVisibilityChangeCb =
204          [this](std::shared_ptr<RSOcclusionData> occlusionData) { this->WindowVisibilityChangeCallback(occlusionData); };
205      WLOGI("RegisterWindowVisibilityChangeCallback");
206      if (rsInterface_.RegisterOcclusionChangeCallback(windowVisibilityChangeCb) != WM_OK) {
207          WLOGFE("RegisterWindowVisibilityChangeCallback failed");
208      }
209  }
210  
InitWithAbilityManagerServiceAdded()211  void WindowManagerService::InitWithAbilityManagerServiceAdded()
212  {
213      if (snapshotController_ == nullptr) {
214          snapshotController_ = new SnapshotController(windowRoot_, handler_);
215      }
216      WLOGI("RegisterSnapshotHandler");
217      if (AAFwk::AbilityManagerClient::GetInstance()->RegisterSnapshotHandler(snapshotController_) != ERR_OK) {
218          WLOGFE("RegisterSnapshotHandler failed");
219      }
220  
221      if (wmsHandler_ == nullptr) {
222          wmsHandler_ = new WindowManagerServiceHandler();
223      }
224      WLOGI("RegisterWindowManagerServiceHandler");
225      bool animaEnabled = RemoteAnimation::CheckAnimationController();
226      if (AAFwk::AbilityManagerClient::GetInstance()->RegisterWindowManagerServiceHandler(
227          wmsHandler_, animaEnabled) != ERR_OK) {
228          WLOGFE("RegisterWindowManagerServiceHandler failed");
229      }
230  }
231  
NotifyWindowTransition(sptr<AAFwk::AbilityTransitionInfo> from,sptr<AAFwk::AbilityTransitionInfo> to,bool & animaEnabled)232  void WindowManagerServiceHandler::NotifyWindowTransition(
233      sptr<AAFwk::AbilityTransitionInfo> from, sptr<AAFwk::AbilityTransitionInfo> to, bool& animaEnabled)
234  {
235      sptr<WindowTransitionInfo> fromInfo = nullptr;
236      sptr<WindowTransitionInfo> toInfo = nullptr;
237      if (from) { // if exists, transition to window transition info
238          fromInfo = new WindowTransitionInfo(from);
239      }
240      if (to) {
241          toInfo = new WindowTransitionInfo(to);
242      }
243      animaEnabled = RemoteAnimation::CheckAnimationController();
244      WindowManagerService::GetInstance().NotifyWindowTransition(fromInfo, toInfo, false);
245  }
246  
NotifyAnimationAbilityDied(sptr<AAFwk::AbilityTransitionInfo> info)247  void WindowManagerServiceHandler::NotifyAnimationAbilityDied(sptr<AAFwk::AbilityTransitionInfo> info)
248  {
249      sptr<WindowTransitionInfo> windowTransitionInfo = new WindowTransitionInfo(info);
250      WindowManagerService::GetInstance().NotifyAnimationAbilityDied(windowTransitionInfo);
251  }
252  
GetFocusWindow(sptr<IRemoteObject> & abilityToken)253  int32_t WindowManagerServiceHandler::GetFocusWindow(sptr<IRemoteObject>& abilityToken)
254  {
255      return static_cast<int32_t>(WindowManagerService::GetInstance().GetFocusWindowInfo(abilityToken));
256  }
257  
StartingWindow(sptr<AAFwk::AbilityTransitionInfo> info,std::shared_ptr<Media::PixelMap> pixelMap)258  void WindowManagerServiceHandler::StartingWindow(
259      sptr<AAFwk::AbilityTransitionInfo> info, std::shared_ptr<Media::PixelMap> pixelMap)
260  {
261      sptr<WindowTransitionInfo> windowInfo = new WindowTransitionInfo(info);
262      WLOGI("hot start is called");
263      WindowManagerService::GetInstance().StartingWindow(windowInfo, pixelMap, false);
264  }
265  
StartingWindow(sptr<AAFwk::AbilityTransitionInfo> info,std::shared_ptr<Media::PixelMap> pixelMap,uint32_t bgColor)266  void WindowManagerServiceHandler::StartingWindow(
267      sptr<AAFwk::AbilityTransitionInfo> info, std::shared_ptr<Media::PixelMap> pixelMap, uint32_t bgColor)
268  {
269      sptr<WindowTransitionInfo> windowInfo = new WindowTransitionInfo(info);
270      WLOGI("cold start is called");
271      WindowManagerService::GetInstance().StartingWindow(windowInfo, pixelMap, true, bgColor);
272  }
273  
CancelStartingWindow(sptr<IRemoteObject> abilityToken)274  void WindowManagerServiceHandler::CancelStartingWindow(sptr<IRemoteObject> abilityToken)
275  {
276      WLOGI("WindowManagerServiceHandler CancelStartingWindow!");
277      WindowManagerService::GetInstance().CancelStartingWindow(abilityToken);
278  }
279  
MoveMissionsToForeground(const std::vector<int32_t> & missionIds,int32_t topMissionId)280  int32_t WindowManagerServiceHandler::MoveMissionsToForeground(const std::vector<int32_t>& missionIds,
281      int32_t topMissionId)
282  {
283      WLOGD("WindowManagerServiceHandler MoveMissionsToForeground!");
284      return static_cast<int32_t>(WindowManagerService::GetInstance().MoveMissionsToForeground(missionIds, topMissionId));
285  }
286  
MoveMissionsToBackground(const std::vector<int32_t> & missionIds,std::vector<int32_t> & result)287  int32_t WindowManagerServiceHandler::MoveMissionsToBackground(const std::vector<int32_t>& missionIds,
288      std::vector<int32_t>& result)
289  {
290      WLOGD("WindowManagerServiceHandler MoveMissionsToBackground!");
291      return static_cast<int32_t>(WindowManagerService::GetInstance().MoveMissionsToBackground(missionIds, result));
292  }
293  
Init()294  bool WindowManagerService::Init()
295  {
296      WLOGI("Init start");
297      if (WindowManagerConfig::LoadConfigXml()) {
298          if (WindowManagerConfig::GetConfig().IsMap()) {
299              WindowManagerConfig::DumpConfig(*WindowManagerConfig::GetConfig().mapValue_);
300          }
301          ConfigureWindowManagerService();
302          StartingWindow::SetAnimationConfig(WindowNodeContainer::GetAnimationConfigRef());
303      }
304      if (PersistentStorage::HasKey("maximize_state", PersistentStorageType::MAXIMIZE_STATE)) {
305          int32_t storageMode = -1;
306          PersistentStorage::Get("maximize_state", storageMode, PersistentStorageType::MAXIMIZE_STATE);
307          if (storageMode == static_cast<int32_t>(MaximizeMode::MODE_AVOID_SYSTEM_BAR) ||
308              storageMode == static_cast<int32_t>(MaximizeMode::MODE_FULL_FILL)) {
309              maximizeMode_ = static_cast<MaximizeMode>(storageMode);
310          }
311      }
312      WindowSystemEffect::SetWindowRoot(windowRoot_);
313      WLOGI("Init success");
314      return true;
315  }
316  
Dump(int fd,const std::vector<std::u16string> & args)317  int WindowManagerService::Dump(int fd, const std::vector<std::u16string>& args)
318  {
319      if (windowDumper_ == nullptr) {
320          windowDumper_ = new WindowDumper(windowRoot_);
321      }
322      WLOGFI("Pid : %{public}d", IPCSkeleton::GetCallingPid());
323      auto task = [this, fd, &args]() {
324          return static_cast<int>(windowDumper_->Dump(fd, args));
325      };
326      return PostSyncTask(task, "Dump");
327  }
328  
ConfigureWindowManagerService()329  void WindowManagerService::ConfigureWindowManagerService()
330  {
331      const auto& config = WindowManagerConfig::GetConfig();
332      WindowManagerConfig::ConfigItem item = config["decor"];
333      if (item.IsMap()) {
334          ConfigDecor(item);
335      }
336      item = config["minimizeByOther"].GetProp("enable");
337      if (item.IsBool()) {
338          MinimizeApp::SetMinimizedByOtherConfig(item.boolValue_);
339      }
340      item = config["stretchable"].GetProp("enable");
341      if (item.IsBool()) {
342          systemConfig_.isStretchable_ = item.boolValue_;
343      }
344      item = config["defaultWindowMode"];
345      if (item.IsInts()) {
346          auto numbers = *item.intsValue_;
347          if (numbers.size() == 1 &&
348              (numbers[0] == static_cast<int32_t>(WindowMode::WINDOW_MODE_FULLSCREEN) ||
349               numbers[0] == static_cast<int32_t>(WindowMode::WINDOW_MODE_FLOATING))) {
350              systemConfig_.defaultWindowMode_ = static_cast<WindowMode>(static_cast<uint32_t>(numbers[0]));
351              StartingWindow::SetDefaultWindowMode(systemConfig_.defaultWindowMode_);
352          }
353      }
354      item = config["dragFrameGravity"];
355      if (item.IsInts()) {
356          auto numbers = *item.intsValue_;
357          if (numbers.size() == 1
358              && (numbers[0] == static_cast<int32_t>(Gravity::RESIZE)
359              || numbers[0] == static_cast<int32_t>(Gravity::TOP_LEFT))) {
360              windowController_->SetDragFrameGravity(static_cast<int32_t>(numbers[0]));
361          }
362      }
363      item = config["remoteAnimation"].GetProp("enable");
364      if (item.IsBool()) {
365          RemoteAnimation::isRemoteAnimationEnable_ = item.boolValue_;
366      }
367      item = config["maxAppWindowNumber"];
368      if (item.IsInts()) {
369          auto numbers = *item.intsValue_;
370          if (numbers.size() == 1 && numbers[0] > 0) {
371              windowRoot_->SetMaxAppWindowNumber(static_cast<uint32_t>(numbers[0]));
372          }
373      }
374      item = config["modeChangeHotZones"];
375      if (item.IsInts()) {
376          ConfigHotZones(*item.intsValue_);
377      }
378      item = config["splitRatios"];
379      if (item.IsFloats()) {
380          windowRoot_->SetSplitRatios(*item.floatsValue_);
381      }
382      item = config["exitSplitRatios"];
383      if (item.IsFloats()) {
384          windowRoot_->SetExitSplitRatios(*item.floatsValue_);
385      }
386      item = config["windowAnimation"];
387      if (item.IsMap()) {
388          ConfigWindowAnimation(item);
389      }
390      item = config["keyboardAnimation"];
391      if (item.IsMap()) {
392          ConfigKeyboardAnimation(item);
393      }
394      item = config["startWindowTransitionAnimation"];
395      if (item.IsMap()) {
396          ConfigStartingWindowAnimation(item);
397      }
398      item = config["windowEffect"];
399      if (item.IsMap()) {
400          ConfigWindowEffect(item);
401      }
402      item = config["floatingBottomPosY"];
403      if (item.IsInts()) {
404          auto numbers = *item.intsValue_;
405          if (numbers.size() == 1 && numbers[0] > 0) {
406              WindowLayoutPolicy::SetCascadeRectBottomPosYLimit(static_cast<uint32_t>(numbers[0]));
407          }
408      }
409      item = config["configMainFloatingWindowAbove"].GetProp("enable");
410      if (item.IsBool()) {
411          WindowNodeContainer::SetConfigMainFloatingWindowAbove(item.boolValue_);
412      }
413      item = config["maxMainFloatingWindowNumber"];
414      if (item.IsInts()) {
415          auto numbers = *item.intsValue_;
416          if (numbers.size() == 1 && numbers[0] > 0) {
417              WindowNodeContainer::SetMaxMainFloatingWindowNumber(static_cast<uint32_t>(numbers[0]));
418          }
419      }
420      item = config["maxFloatingWindowSize"];
421      if (item.IsInts()) {
422          auto numbers = *item.intsValue_;
423          if (numbers.size() == 1 && numbers[0] > 0) {
424              WindowLayoutPolicy::SetMaxFloatingWindowSize(static_cast<uint32_t>(numbers[0]));
425          }
426      }
427      item = config["defaultMaximizeMode"];
428      if (item.IsInts()) {
429          auto numbers = *item.intsValue_;
430          if (numbers.size() == 1 &&
431              (numbers[0] == static_cast<int32_t>(MaximizeMode::MODE_AVOID_SYSTEM_BAR) ||
432              numbers[0] == static_cast<int32_t>(MaximizeMode::MODE_FULL_FILL))) {
433              maximizeMode_ = static_cast<MaximizeMode>(numbers[0]);
434          }
435      }
436      item = config["uiType"];
437      if (item.IsString()) {
438          systemConfig_.uiType_ = item.stringValue_;
439          StartingWindow::uiType_ = item.stringValue_;
440          WindowNodeContainer::uiType_ = item.stringValue_;
441      }
442      item = config["supportTypeFloatWindow"].GetProp("enable");
443      if (item.IsBool()) {
444          systemConfig_.supportTypeFloatWindow_ = item.boolValue_;
445      }
446  }
447  
ConfigHotZones(const std::vector<int> & numbers)448  void WindowManagerService::ConfigHotZones(const std::vector<int>& numbers)
449  {
450      if (numbers.size() == 3) { // 3 hot zones
451          hotZonesConfig_.fullscreenRange_ = static_cast<uint32_t>(numbers[0]); // 0 fullscreen
452          hotZonesConfig_.primaryRange_ = static_cast<uint32_t>(numbers[1]);    // 1 primary
453          hotZonesConfig_.secondaryRange_ = static_cast<uint32_t>(numbers[2]);  // 2 secondary
454          hotZonesConfig_.isModeChangeHotZoneConfigured_ = true;
455      }
456  }
457  
ConfigDecor(const WindowManagerConfig::ConfigItem & decorConfig)458  void WindowManagerService::ConfigDecor(const WindowManagerConfig::ConfigItem& decorConfig)
459  {
460      WindowManagerConfig::ConfigItem item = decorConfig.GetProp("enable");
461      if (item.IsBool()) {
462          systemConfig_.isSystemDecorEnable_ = item.boolValue_;
463          std::vector<std::string> supportedModes;
464          item = decorConfig["supportedMode"];
465          if (item.IsStrings()) {
466              systemConfig_.decorWindowModeSupportType_ = 0;
467              supportedModes = *item.stringsValue_;
468          }
469          for (auto mode : supportedModes) {
470              if (mode == "fullscreen") {
471                  systemConfig_.decorWindowModeSupportType_ |= WindowModeSupport::WINDOW_MODE_SUPPORT_FULLSCREEN;
472              } else if (mode == "floating") {
473                  systemConfig_.decorWindowModeSupportType_ |= WindowModeSupport::WINDOW_MODE_SUPPORT_FLOATING;
474              } else if (mode == "pip") {
475                  systemConfig_.decorWindowModeSupportType_ |= WindowModeSupport::WINDOW_MODE_SUPPORT_PIP;
476              } else if (mode == "split") {
477                  systemConfig_.decorWindowModeSupportType_ |= WindowModeSupport::WINDOW_MODE_SUPPORT_SPLIT_PRIMARY |
478                      WindowModeSupport::WINDOW_MODE_SUPPORT_SPLIT_SECONDARY;
479              } else {
480                  WLOGFW("Invalid supporedMode");
481                  systemConfig_.decorWindowModeSupportType_ = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL;
482                  break;
483              }
484          }
485      }
486  }
487  
ConfigWindowAnimation(const WindowManagerConfig::ConfigItem & animeConfig)488  void WindowManagerService::ConfigWindowAnimation(const WindowManagerConfig::ConfigItem& animeConfig)
489  {
490      auto& windowAnimationConfig = WindowNodeContainer::GetAnimationConfigRef().windowAnimationConfig_;
491      WindowManagerConfig::ConfigItem item = animeConfig["timing"];
492      if (item.IsMap() && item.mapValue_->count("curve")) {
493          windowAnimationConfig.animationTiming_.timingCurve_ = CreateCurve(item["curve"]);
494      }
495      item = animeConfig["timing"]["duration"];
496      if (item.IsInts()) {
497          auto numbers = *item.intsValue_;
498          if (numbers.size() == 1) { // duration
499              windowAnimationConfig.animationTiming_.timingProtocol_ =
500                  RSAnimationTimingProtocol(numbers[0]);
501          }
502      }
503      item = animeConfig["scale"];
504      if (item.IsFloats()) {
505          auto numbers = *item.floatsValue_;
506          if (numbers.size() == 1) { // 1 xy scale
507              windowAnimationConfig.scale_.x_ =
508              windowAnimationConfig.scale_.y_ = numbers[0]; // 0 xy scale
509          } else if (numbers.size() == 2) { // 2 x,y sclae
510              windowAnimationConfig.scale_.x_ = numbers[0]; // 0 x scale
511              windowAnimationConfig.scale_.y_ = numbers[1]; // 1 y scale
512          } else if (numbers.size() == 3) { // 3 x,y,z scale
513              windowAnimationConfig.scale_ = Vector3f(&numbers[0]);
514          }
515      }
516      item = animeConfig["rotation"];
517      if (item.IsFloats() && item.floatsValue_->size() == 4) { // 4 (axix,angle)
518          windowAnimationConfig.rotation_ = Vector4f(item.floatsValue_->data());
519      }
520      item = animeConfig["translate"];
521      if (item.IsFloats()) {
522          auto numbers = *item.floatsValue_;
523          if (numbers.size() == 2) { // 2 translate xy
524              windowAnimationConfig.translate_.x_ = numbers[0]; // 0 translate x
525              windowAnimationConfig.translate_.y_ = numbers[1]; // 1 translate y
526          } else if (numbers.size() == 3) { // 3 translate xyz
527              windowAnimationConfig.translate_.x_ = numbers[0]; // 0 translate x
528              windowAnimationConfig.translate_.y_ = numbers[1]; // 1 translate y
529              windowAnimationConfig.translate_.z_ = numbers[2]; // 2 translate z
530          }
531      }
532      item = animeConfig["opacity"];
533      if (item.IsFloats()) {
534          auto numbers = *item.floatsValue_;
535          numbers.size() == 1 ? (windowAnimationConfig.opacity_ = numbers[0]) : float();
536      }
537  }
538  
ConfigKeyboardAnimation(const WindowManagerConfig::ConfigItem & animeConfig)539  void WindowManagerService::ConfigKeyboardAnimation(const WindowManagerConfig::ConfigItem& animeConfig)
540  {
541      auto& animationConfig = WindowNodeContainer::GetAnimationConfigRef();
542      WindowManagerConfig::ConfigItem inItem = animeConfig["animationIn"]["timing"];
543      if (inItem.IsMap() && inItem.mapValue_ != nullptr && inItem.mapValue_->count("curve")) {
544          CreateKeyboardCurve(inItem, animationConfig.keyboardAnimationIn_, systemConfig_.animationIn_);
545      }
546  
547      WindowManagerConfig::ConfigItem outItem = animeConfig["animationOut"]["timing"];
548      if (outItem.IsMap() && outItem.mapValue_ != nullptr && outItem.mapValue_->count("curve")) {
549          CreateKeyboardCurve(outItem, animationConfig.keyboardAnimationOut_, systemConfig_.animationOut_);
550      }
551      WLOGFI("curveIn:[%{public}s, %{public}u], curveOut:[%{public}s, %{public}u]",
552          systemConfig_.animationIn_.curveType_.c_str(), systemConfig_.animationIn_.duration_,
553          systemConfig_.animationOut_.curveType_.c_str(), systemConfig_.animationOut_.duration_);
554  }
555  
ConfigStartingWindowAnimation(const WindowManagerConfig::ConfigItem & animeConfig)556  void WindowManagerService::ConfigStartingWindowAnimation(const WindowManagerConfig::ConfigItem& animeConfig)
557  {
558      WindowManagerConfig::ConfigItem item = animeConfig.GetProp("enable");
559      if (item.IsBool()) {
560          StartingWindow::transAnimateEnable_ = item.boolValue_;
561      }
562      auto& startWinAnimationConfig = WindowNodeContainer::GetAnimationConfigRef().startWinAnimationConfig_;
563      item = animeConfig["timing"];
564      if (item.IsMap() && item.mapValue_->count("curve")) {
565          startWinAnimationConfig.timingCurve_ = CreateCurve(item["curve"]);
566      }
567      item = animeConfig["timing"]["duration"];
568      if (item.IsInts()) {
569          auto numbers = *item.intsValue_;
570          if (numbers.size() == 1) { // duration
571              startWinAnimationConfig.timingProtocol_ = RSAnimationTimingProtocol(numbers[0]);
572          }
573      }
574      item = animeConfig["opacityStart"];
575      if (item.IsFloats()) {
576          auto numbers = *item.floatsValue_;
577          numbers.size() == 1 ? (startWinAnimationConfig.opacityStart_ = numbers[0]) : float();
578      }
579      item = animeConfig["opacityEnd"];
580      if (item.IsFloats()) {
581          auto numbers = *item.floatsValue_;
582          numbers.size() == 1 ? (startWinAnimationConfig.opacityEnd_ = numbers[0]) : float();
583      }
584  }
585  
ConfigAppWindowCornerRadius(const WindowManagerConfig::ConfigItem & item,float & out)586  bool WindowManagerService::ConfigAppWindowCornerRadius(const WindowManagerConfig::ConfigItem& item, float& out)
587  {
588      std::map<std::string, float> stringToCornerRadius = {
589          {"off", 0.0f}, {"defaultCornerRadiusXS", 4.0f}, {"defaultCornerRadiusS", 8.0f},
590          {"defaultCornerRadiusM", 12.0f}, {"defaultCornerRadiusL", 16.0f}, {"defaultCornerRadiusXL", 24.0f}
591      };
592  
593      if (item.IsString()) {
594          auto value = item.stringValue_;
595          if (stringToCornerRadius.find(value) != stringToCornerRadius.end()) {
596              out = stringToCornerRadius[value];
597              return true;
598          }
599      }
600      return false;
601  }
602  
ConfigAppWindowShadow(const WindowManagerConfig::ConfigItem & shadowConfig,WindowShadowParameters & outShadow)603  bool WindowManagerService::ConfigAppWindowShadow(const WindowManagerConfig::ConfigItem& shadowConfig,
604      WindowShadowParameters& outShadow)
605  {
606      WindowManagerConfig::ConfigItem item = shadowConfig["elevation"];
607      if (item.IsFloats()) {
608          auto elevation = *item.floatsValue_;
609          if (elevation.size() != 1 || MathHelper::LessNotEqual(elevation[0], 0.0)) {
610              return false;
611          }
612          outShadow.elevation_ = elevation[0];
613      }
614  
615      item = shadowConfig["color"];
616      if (item.IsString()) {
617          auto color = item.stringValue_;
618          uint32_t colorValue;
619          if (!ColorParser::Parse(color, colorValue)) {
620              return false;
621          }
622          outShadow.color_ = color;
623      }
624  
625      item = shadowConfig["offsetX"];
626      if (item.IsFloats()) {
627          auto offsetX = *item.floatsValue_;
628          if (offsetX.size() != 1) {
629              return false;
630          }
631          outShadow.offsetX_ = offsetX[0];
632      }
633  
634      item = shadowConfig["offsetY"];
635      if (item.IsFloats()) {
636          auto offsetY = *item.floatsValue_;
637          if (offsetY.size() != 1) {
638              return false;
639          }
640          outShadow.offsetY_ = offsetY[0];
641      }
642  
643      item = shadowConfig["alpha"];
644      if (item.IsFloats()) {
645          auto alpha = *item.floatsValue_;
646          if (alpha.size() != 1 ||
647              (MathHelper::LessNotEqual(alpha[0], 0.0) && MathHelper::GreatNotEqual(alpha[0], 1.0))) {
648              return false;
649          }
650          outShadow.alpha_ = alpha[0];
651      }
652  
653      item = shadowConfig["radius"];
654      if (item.IsFloats()) {
655          auto radius = *item.floatsValue_;
656          if (radius.size() != 1 || MathHelper::LessNotEqual(radius[0], 0.0)) {
657              return false;
658          }
659          outShadow.radius_ = radius[0];
660      }
661  
662      return true;
663  }
664  
ConfigWindowEffect(const WindowManagerConfig::ConfigItem & effectConfig)665  void WindowManagerService::ConfigWindowEffect(const WindowManagerConfig::ConfigItem& effectConfig)
666  {
667      AppWindowEffectConfig config;
668      AppWindowEffectConfig systemEffectConfig;
669      // config corner radius
670      WindowManagerConfig::ConfigItem item = effectConfig["appWindows"]["cornerRadius"];
671      if (item.IsMap()) {
672          if (ConfigAppWindowCornerRadius(item["fullScreen"], config.fullScreenCornerRadius_) &&
673              ConfigAppWindowCornerRadius(item["split"], config.splitCornerRadius_) &&
674              ConfigAppWindowCornerRadius(item["float"], config.floatCornerRadius_)) {
675              systemEffectConfig = config;
676          }
677      }
678  
679      // config shadow
680      item = effectConfig["appWindows"]["shadow"]["focused"];
681      if (item.IsMap()) {
682          if (ConfigAppWindowShadow(item, config.focusedShadow_)) {
683              systemEffectConfig.focusedShadow_ = config.focusedShadow_;
684          }
685      }
686  
687      item = effectConfig["appWindows"]["shadow"]["unfocused"];
688      if (item.IsMap()) {
689          if (ConfigAppWindowShadow(item, config.unfocusedShadow_)) {
690              systemEffectConfig.unfocusedShadow_ = config.unfocusedShadow_;
691          }
692      }
693      WindowSystemEffect::SetWindowSystemEffectConfig(systemEffectConfig);
694  }
695  
CreateKeyboardCurve(const WindowManagerConfig::ConfigItem & config,AnimationConfig::KeyboardAnimation & animateConfig,KeyboardAnimationCurve & sysCurveConfig)696  void WindowManagerService::CreateKeyboardCurve(const WindowManagerConfig::ConfigItem& config,
697      AnimationConfig::KeyboardAnimation& animateConfig, KeyboardAnimationCurve& sysCurveConfig)
698  {
699      // parse curve params
700      const WindowManagerConfig::ConfigItem& curveConfig = config["curve"];
701      static std::map<std::string, RSAnimationTimingCurve> curveMap = {
702          { "easeOut",           RSAnimationTimingCurve::EASE_OUT },
703          { "ease",              RSAnimationTimingCurve::EASE },
704          { "easeIn",            RSAnimationTimingCurve::EASE_IN },
705          { "easeInOut",         RSAnimationTimingCurve::EASE_IN_OUT },
706          { "default",           RSAnimationTimingCurve::DEFAULT },
707          { "linear",            RSAnimationTimingCurve::LINEAR },
708          { "spring",            RSAnimationTimingCurve::SPRING },
709          { "interactiveSpring", RSAnimationTimingCurve::INTERACTIVE_SPRING }
710      };
711      RSAnimationTimingCurve curve = RSAnimationTimingCurve::EASE_OUT;
712      std::string keyboardCurveName = "easeOut";
713      std::vector<float> keyboardCurveParams = {};
714      const auto& nameItem = curveConfig.GetProp("name");
715      if (nameItem.IsString()) {
716          std::string name = nameItem.stringValue_;
717          if (name == "cubic" && curveConfig.IsFloats() && curveConfig.floatsValue_ != nullptr &&
718              curveConfig.floatsValue_->size() == 4) { // 4: param size
719              const auto& numbers = *curveConfig.floatsValue_;
720              keyboardCurveName = name;
721              keyboardCurveParams.assign(numbers.begin(), numbers.end());
722              curve = RSAnimationTimingCurve::CreateCubicCurve(
723                  numbers[0],  // 0 ctrlX1
724                  numbers[1],  // 1 ctrlY1
725                  numbers[2],  // 2 ctrlX2
726                  numbers[3]); // 3 ctrlY2
727          } else {
728              auto iter = curveMap.find(name);
729              if (iter != curveMap.end()) {
730                  keyboardCurveName = name;
731                  curve = iter->second;
732              }
733          }
734      }
735      animateConfig.curve_ = curve;
736      sysCurveConfig.curveType_ = keyboardCurveName;
737      sysCurveConfig.curveParams_.assign(keyboardCurveParams.begin(), keyboardCurveParams.end());
738  
739      // parse curve duration
740      const WindowManagerConfig::ConfigItem& duration = config["duration"];
741      if (duration.IsInts() && duration.intsValue_ != nullptr) {
742          auto numbers = *duration.intsValue_;
743          if (numbers.size() == 1) { // duration
744              animateConfig.duration_ = RSAnimationTimingProtocol(numbers[0]);
745              sysCurveConfig.duration_ = static_cast<uint32_t>(numbers[0]);
746          }
747      }
748  }
749  
CreateCurve(const WindowManagerConfig::ConfigItem & curveConfig)750  RSAnimationTimingCurve WindowManagerService::CreateCurve(const WindowManagerConfig::ConfigItem& curveConfig)
751  {
752      static std::map<std::string, RSAnimationTimingCurve> curveMap = {
753          { "easeOut",           RSAnimationTimingCurve::EASE_OUT },
754          { "ease",              RSAnimationTimingCurve::EASE },
755          { "easeIn",            RSAnimationTimingCurve::EASE_IN },
756          { "easeInOut",         RSAnimationTimingCurve::EASE_IN_OUT },
757          { "default",           RSAnimationTimingCurve::DEFAULT },
758          { "linear",            RSAnimationTimingCurve::LINEAR },
759          { "spring",            RSAnimationTimingCurve::SPRING },
760          { "interactiveSpring", RSAnimationTimingCurve::INTERACTIVE_SPRING }
761      };
762  
763      RSAnimationTimingCurve curve = RSAnimationTimingCurve::EASE_OUT;
764      const auto& nameItem = curveConfig.GetProp("name");
765      if (nameItem.IsString()) {
766          std::string name = nameItem.stringValue_;
767          if (name == "cubic" && curveConfig.IsFloats() && curveConfig.floatsValue_ != nullptr &&
768              curveConfig.floatsValue_->size() == 4) { // 4 curve parameter
769              const auto& numbers = *curveConfig.floatsValue_;
770              curve = RSAnimationTimingCurve::CreateCubicCurve(
771                  numbers[0],  // 0 ctrlX1
772                  numbers[1],  // 1 ctrlY1
773                  numbers[2],  // 2 ctrlX2
774                  numbers[3]); // 3 ctrlY2
775          } else {
776              if (auto iter = curveMap.find(name); iter != curveMap.end()) {
777                  curve = iter->second;
778              }
779          }
780      }
781      return curve;
782  }
783  
OnStop()784  void WindowManagerService::OnStop()
785  {
786      windowCommonEvent_->UnSubscriberEvent();
787      WindowInnerManager::GetInstance().Stop();
788      WLOGI("ready to stop service.");
789  }
790  
NotifyWindowTransition(sptr<WindowTransitionInfo> & fromInfo,sptr<WindowTransitionInfo> & toInfo,bool isFromClient)791  WMError WindowManagerService::NotifyWindowTransition(
792      sptr<WindowTransitionInfo>& fromInfo, sptr<WindowTransitionInfo>& toInfo, bool isFromClient)
793  {
794      if (!isFromClient) {
795          WLOGI("NotifyWindowTransition asynchronously.");
796          auto task = [this, fromInfo, toInfo]() mutable {
797              return windowController_->NotifyWindowTransition(fromInfo, toInfo);
798          };
799          PostAsyncTask(task, "NotifyWindowTransition");
800          return WMError::WM_OK;
801      } else {
802          WLOGI("NotifyWindowTransition synchronously.");
803          auto task = [this, &fromInfo, &toInfo]() {
804              return windowController_->NotifyWindowTransition(fromInfo, toInfo);
805          };
806          return PostSyncTask(task, "NotifyWindowTransition");
807      }
808  }
809  
NotifyAnimationAbilityDied(sptr<WindowTransitionInfo> info)810  void WindowManagerService::NotifyAnimationAbilityDied(sptr<WindowTransitionInfo> info)
811  {
812      auto task = [this, info]() mutable {
813          return RemoteAnimation::NotifyAnimationAbilityDied(info);
814      };
815      PostAsyncTask(task, "NotifyAnimationAbilityDied");
816  }
817  
GetFocusWindowInfo(sptr<IRemoteObject> & abilityToken)818  WMError WindowManagerService::GetFocusWindowInfo(sptr<IRemoteObject>& abilityToken)
819  {
820      auto task = [this, &abilityToken]() {
821          return windowController_->GetFocusWindowInfo(abilityToken);
822      };
823      return PostSyncTask(task, "GetFocusWindowInfo");
824  }
825  
StartingWindow(sptr<WindowTransitionInfo> info,std::shared_ptr<Media::PixelMap> pixelMap,bool isColdStart,uint32_t bkgColor)826  void WindowManagerService::StartingWindow(sptr<WindowTransitionInfo> info, std::shared_ptr<Media::PixelMap> pixelMap,
827      bool isColdStart, uint32_t bkgColor)
828  {
829      if (!startingOpen_) {
830          WLOGI("startingWindow not open!");
831          return;
832      }
833      if (info) {
834          info->isSystemCalling_ = Permission::IsSystemCalling();
835      }
836      auto task = [this, info, pixelMap, isColdStart, bkgColor]() {
837          windowController_->StartingWindow(info, pixelMap, bkgColor, isColdStart);
838      };
839      PostAsyncTask(task, "StartingWindow");
840  }
841  
CancelStartingWindow(sptr<IRemoteObject> abilityToken)842  void WindowManagerService::CancelStartingWindow(sptr<IRemoteObject> abilityToken)
843  {
844      WLOGI("begin");
845      if (!startingOpen_) {
846          WLOGI("startingWindow not open!");
847          return;
848      }
849      auto task = [this, abilityToken]() {
850          windowController_->CancelStartingWindow(abilityToken);
851      };
852      PostAsyncTask(task, "CancelStartingWindow");
853  }
854  
MoveMissionsToForeground(const std::vector<int32_t> & missionIds,int32_t topMissionId)855  WMError WindowManagerService::MoveMissionsToForeground(const std::vector<int32_t>& missionIds, int32_t topMissionId)
856  {
857      if (windowGroupMgr_) {
858          auto task = [this, &missionIds, topMissionId]() {
859              WMError res = windowGroupMgr_->MoveMissionsToForeground(missionIds, topMissionId);
860              // no need to return inner error to caller
861              if (res > WMError::WM_ERROR_NEED_REPORT_BASE) {
862                  return res;
863              }
864              return WMError::WM_OK;
865          };
866          return PostSyncTask(task, "MoveMissionsToForeground");
867      }
868      return WMError::WM_ERROR_NULLPTR;
869  }
870  
MoveMissionsToBackground(const std::vector<int32_t> & missionIds,std::vector<int32_t> & result)871  WMError WindowManagerService::MoveMissionsToBackground(const std::vector<int32_t>& missionIds,
872      std::vector<int32_t>& result)
873  {
874      if (windowGroupMgr_) {
875          auto task = [this, &missionIds, &result]() {
876              WMError res = windowGroupMgr_->MoveMissionsToBackground(missionIds, result);
877              // no need to return wms inner error to caller
878              if (res > WMError::WM_ERROR_NEED_REPORT_BASE) {
879                  return res;
880              }
881              return WMError::WM_OK;
882          };
883          return PostSyncTask(task, "MoveMissionsToBackground");
884      }
885      return WMError::WM_ERROR_NULLPTR;
886  }
887  
888  
CheckAnimationPermission(const sptr<WindowProperty> & property) const889  bool WindowManagerService::CheckAnimationPermission(const sptr<WindowProperty>& property) const
890  {
891      WindowType type = property->GetWindowType();
892      // If the animation type is NONE or the window type is WINDOW_TYPE_INPUT_METHOD_FLOAT
893      if (property->GetAnimationFlag() == static_cast<uint32_t>(WindowAnimation::NONE) ||
894          type == WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT) {
895          return true;
896      }
897      // If the animation type is DEFAULT and the window type is AppWindow
898      if (property->GetAnimationFlag() == static_cast<uint32_t>(WindowAnimation::DEFAULT) &&
899          WindowHelper::IsAppWindow(type)) {
900          return true;
901      }
902      // If the animation type is CUSTOM
903      if (Permission::IsSystemCalling() || Permission::IsStartByHdcd()) {
904          WLOGFD("check IsSystemCalling permission success, show with animation calling.");
905          return true;
906      }
907      WLOGFE("check animation permission failed");
908      return false;
909  }
910  
CheckSystemWindowPermission(const sptr<WindowProperty> & property) const911  bool WindowManagerService::CheckSystemWindowPermission(const sptr<WindowProperty>& property) const
912  {
913      WindowType type = property->GetWindowType();
914      if (!WindowHelper::IsSystemWindow(type)) {
915          // type is not system
916          return true;
917      }
918      if ((type == WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT || type == WindowType::WINDOW_TYPE_INPUT_METHOD_STATUS_BAR)
919          && Permission::IsStartByInputMethod()) {
920          // WINDOW_TYPE_INPUT_METHOD_FLOAT counld be created by input method app
921          WLOGFD("check create permission success, input method app create input method window.");
922          return true;
923      }
924      if (type == WindowType::WINDOW_TYPE_DRAGGING_EFFECT || type == WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW ||
925          type == WindowType::WINDOW_TYPE_TOAST || type == WindowType::WINDOW_TYPE_DIALOG) {
926          // some system types counld be created by normal app
927          return true;
928      }
929      if (type == WindowType::WINDOW_TYPE_FLOAT &&
930          Permission::CheckCallingPermission("ohos.permission.SYSTEM_FLOAT_WINDOW")) {
931          // WINDOW_TYPE_FLOAT counld be created by normal app with the corresponding permission
932          WLOGFD("check create permission success, normal app create float window with request permission.");
933          return true;
934      }
935      if (Permission::IsSystemCalling() || Permission::IsStartByHdcd()) {
936          WLOGFD("check create permission success, create with system calling.");
937          return true;
938      }
939      WLOGFE("check system window permission failed.");
940      return false;
941  }
942  
CreateWindow(sptr<IWindow> & window,sptr<WindowProperty> & property,const std::shared_ptr<RSSurfaceNode> & surfaceNode,uint32_t & windowId,sptr<IRemoteObject> token)943  WMError WindowManagerService::CreateWindow(sptr<IWindow>& window, sptr<WindowProperty>& property,
944      const std::shared_ptr<RSSurfaceNode>& surfaceNode, uint32_t& windowId, sptr<IRemoteObject> token)
945  {
946      if (!window || property == nullptr || surfaceNode == nullptr || !window->AsObject()) {
947          WLOGFE("window is invalid");
948          return WMError::WM_ERROR_NULLPTR;
949      }
950      if (!CheckSystemWindowPermission(property)) {
951          WLOGFE("create system window permission denied!");
952          return WMError::WM_ERROR_NOT_SYSTEM_APP;
953      }
954      int pid = IPCSkeleton::GetCallingRealPid();
955      int uid = IPCSkeleton::GetCallingUid();
956      property->isSystemCalling_ = Permission::IsSystemCalling();
957      auto task = [this, pid, uid, &window, &property, &surfaceNode, &windowId, &token]() {
958          HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:CreateWindow(%u)", windowId);
959          return windowController_->CreateWindow(window, property, surfaceNode, windowId, token, pid, uid);
960      };
961      WMError ret = PostSyncTask(task, "CreateWindow");
962      accessTokenIdMaps_.insert(std::pair(windowId, IPCSkeleton::GetCallingTokenID()));
963      return ret;
964  }
965  
AddWindow(sptr<WindowProperty> & property)966  WMError WindowManagerService::AddWindow(sptr<WindowProperty>& property)
967  {
968      if (property == nullptr) {
969          WLOGFE("property is nullptr");
970          return WMError::WM_ERROR_NULLPTR;
971      }
972      if (!CheckSystemWindowPermission(property) || !CheckAnimationPermission(property)) {
973          WLOGFE("add window permission denied!");
974          return WMError::WM_ERROR_NOT_SYSTEM_APP;
975      }
976      auto task = [this, &property]() {
977          windowShowPerformReport_->start();
978          Rect rect = property->GetRequestRect();
979          uint32_t windowId = property->GetWindowId();
980          WLOGI("[WMS] Add: %{public}5d %{public}4d %{public}4d %{public}4d [%{public}4d %{public}4d " \
981              "%{public}4d %{public}4d]", windowId, property->GetWindowType(), property->GetWindowMode(),
982              property->GetWindowFlags(), rect.posX_, rect.posY_, rect.width_, rect.height_);
983          HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:AddWindow(%u)", windowId);
984          WMError res = windowController_->AddWindowNode(property);
985          if (property->GetWindowType() == WindowType::WINDOW_TYPE_DRAGGING_EFFECT) {
986              dragController_->StartDrag(windowId);
987          }
988          if (res == WMError::WM_OK) {
989              windowShowPerformReport_->end();
990          }
991          return res;
992      };
993      return PostSyncTask(task, "AddWindow");
994  }
995  
RemoveWindow(uint32_t windowId,bool isFromInnerkits)996  WMError WindowManagerService::RemoveWindow(uint32_t windowId, bool isFromInnerkits)
997  {
998      if (!isFromInnerkits && !Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
999          WLOGFE("remove window permission denied!");
1000          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1001      }
1002      if (!accessTokenIdMaps_.isExist(windowId, IPCSkeleton::GetCallingTokenID())) {
1003          WLOGI("Operation rejected");
1004          return WMError::WM_ERROR_INVALID_OPERATION;
1005      }
1006      auto task = [this, windowId]() {
1007          WLOGI("[WMS] Remove: %{public}u", windowId);
1008          HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:RemoveWindow(%u)", windowId);
1009          WindowInnerManager::GetInstance().NotifyWindowRemovedOrDestroyed(windowId);
1010          WMError res = windowController_->RecoverInputEventToClient(windowId);
1011          if (res != WMError::WM_OK) {
1012              return res;
1013          }
1014          return windowController_->RemoveWindowNode(windowId);
1015      };
1016      return PostSyncTask(task, "RemoveWindow");
1017  }
1018  
DestroyWindow(uint32_t windowId,bool onlySelf)1019  WMError WindowManagerService::DestroyWindow(uint32_t windowId, bool onlySelf)
1020  {
1021      if (!accessTokenIdMaps_.isExistAndRemove(windowId, IPCSkeleton::GetCallingTokenID())) {
1022          WLOGI("Operation rejected");
1023          return WMError::WM_ERROR_INVALID_OPERATION;
1024      }
1025      auto task = [this, windowId, onlySelf]() {
1026          auto node = windowRoot_->GetWindowNode(windowId);
1027          if (node == nullptr) {
1028              return WMError::WM_ERROR_NULLPTR;
1029          }
1030          node->stateMachine_.SetDestroyTaskParam(onlySelf);
1031          auto func = [this, windowId]() {
1032              WLOGI("[WMS] Destroy: %{public}u", windowId);
1033              HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:DestroyWindow(%u)", windowId);
1034              WindowInnerManager::GetInstance().NotifyWindowRemovedOrDestroyed(windowId);
1035              windowGroupMgr_->OnWindowDestroyed(windowId);
1036              auto node = windowRoot_->GetWindowNode(windowId);
1037              if (node == nullptr) {
1038                  return WMError::WM_OK;
1039              }
1040              if (node->GetWindowType() == WindowType::WINDOW_TYPE_DRAGGING_EFFECT) {
1041                  dragController_->FinishDrag(windowId);
1042              }
1043              return windowController_->DestroyWindow(windowId, node->stateMachine_.GetDestroyTaskParam());
1044          };
1045          if (RemoteAnimation::IsRemoteAnimationEnabledAndFirst(node->GetDisplayId()) &&
1046              node->stateMachine_.IsRemoteAnimationPlaying()) {
1047              WLOGI("SetDestroyTask id:%{public}u", node->GetWindowId());
1048              node->stateMachine_.SetDestroyTask(func);
1049              return WMError::WM_OK;
1050          }
1051          WLOGI("DestroyWindow windowId: %{public}u, name:%{public}s state: %{public}u",
1052              node->GetWindowId(), node->GetWindowName().c_str(),
1053              static_cast<uint32_t>(node->stateMachine_.GetCurrentState()));
1054          return func();
1055      };
1056      return PostSyncTask(task, "DestroyWindow");
1057  }
1058  
RequestFocus(uint32_t windowId)1059  WMError WindowManagerService::RequestFocus(uint32_t windowId)
1060  {
1061      auto task = [this, windowId]() {
1062          WLOGI("[WMS] RequestFocus: %{public}u", windowId);
1063          return windowController_->RequestFocus(windowId);
1064      };
1065      return PostSyncTask(task, "RequestFocus");
1066  }
1067  
GetAvoidAreaByType(uint32_t windowId,AvoidAreaType avoidAreaType)1068  AvoidArea WindowManagerService::GetAvoidAreaByType(uint32_t windowId, AvoidAreaType avoidAreaType)
1069  {
1070      auto task = [this, windowId, avoidAreaType]() {
1071          WLOGI("[WMS] GetAvoidAreaByType: %{public}u, Type: %{public}u", windowId,
1072              static_cast<uint32_t>(avoidAreaType));
1073          return windowController_->GetAvoidAreaByType(windowId, avoidAreaType);
1074      };
1075      return PostSyncTask(task, "GetAvoidAreaByType");
1076  }
1077  
RegisterWindowManagerAgent(WindowManagerAgentType type,const sptr<IWindowManagerAgent> & windowManagerAgent)1078  WMError WindowManagerService::RegisterWindowManagerAgent(WindowManagerAgentType type,
1079      const sptr<IWindowManagerAgent>& windowManagerAgent)
1080  {
1081      if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1082          WLOGFE("register windowManager agent permission denied!");
1083          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1084      }
1085      if ((windowManagerAgent == nullptr) || (windowManagerAgent->AsObject() == nullptr)) {
1086          WLOGFE("windowManagerAgent is null");
1087          return WMError::WM_ERROR_NULLPTR;
1088      }
1089      auto task = [this, &windowManagerAgent, type]() {
1090          WMError ret = WindowManagerAgentController::GetInstance().RegisterWindowManagerAgent(windowManagerAgent, type);
1091          if (type == WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_SYSTEM_BAR) { // if system bar, notify once
1092              windowController_->NotifySystemBarTints();
1093          }
1094          return ret;
1095      };
1096      return PostSyncTask(task, "RegisterWindowManagerAgent");
1097  }
1098  
UnregisterWindowManagerAgent(WindowManagerAgentType type,const sptr<IWindowManagerAgent> & windowManagerAgent)1099  WMError WindowManagerService::UnregisterWindowManagerAgent(WindowManagerAgentType type,
1100      const sptr<IWindowManagerAgent>& windowManagerAgent)
1101  {
1102      if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1103          WLOGFE("unregister windowManager agent permission denied!");
1104          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1105      }
1106      if ((windowManagerAgent == nullptr) || (windowManagerAgent->AsObject() == nullptr)) {
1107          WLOGFE("windowManagerAgent is null");
1108          return WMError::WM_ERROR_NULLPTR;
1109      }
1110      auto task = [this, &windowManagerAgent, type]() {
1111          return WindowManagerAgentController::GetInstance().UnregisterWindowManagerAgent(windowManagerAgent, type);
1112      };
1113      return PostSyncTask(task, "UnregisterWindowManagerAgent");
1114  }
1115  
SetWindowAnimationController(const sptr<RSIWindowAnimationController> & controller)1116  WMError WindowManagerService::SetWindowAnimationController(const sptr<RSIWindowAnimationController>& controller)
1117  {
1118      if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1119          WLOGFE("set window animation controller permission denied!");
1120          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1121      }
1122      if (controller == nullptr) {
1123          WLOGFE("RSWindowAnimation: Failed to set window animation controller, controller is null!");
1124          return WMError::WM_ERROR_NULLPTR;
1125      }
1126  
1127      sptr<AgentDeathRecipient> deathRecipient = new AgentDeathRecipient(
1128          [this](sptr<IRemoteObject>& remoteObject) {
1129              auto task = [&remoteObject]() {
1130                  RemoteAnimation::OnRemoteDie(remoteObject);
1131              };
1132              PostVoidSyncTask(task, "OnRemoteDie");
1133          }
1134      );
1135      controller->AsObject()->AddDeathRecipient(deathRecipient);
1136      RemoteAnimation::SetWindowControllerAndRoot(windowController_, windowRoot_);
1137      RemoteAnimation::SetMainTaskHandler(handler_);
1138      auto task = [this, &controller]() {
1139          WMError ret = windowController_->SetWindowAnimationController(controller);
1140          RemoteAnimation::SetAnimationFirst(system::GetParameter("persist.window.af.enabled", "1") == "1");
1141          return ret;
1142      };
1143      return PostSyncTask(task, "SetWindowAnimationController");
1144  }
1145  
OnWindowEvent(Event event,const sptr<IRemoteObject> & remoteObject)1146  void WindowManagerService::OnWindowEvent(Event event, const sptr<IRemoteObject>& remoteObject)
1147  {
1148      if (event == Event::REMOTE_DIED) {
1149          auto task = [this, &remoteObject]() {
1150              uint32_t windowId = windowRoot_->GetWindowIdByObject(remoteObject);
1151              auto node = windowRoot_->GetWindowNode(windowId);
1152              if (node == nullptr) {
1153                  WLOGFD("window node is nullptr, REMOTE_DIED no need to destroy");
1154                  return;
1155              }
1156              WLOGI("window %{public}u received REMOTE_DIED", windowId);
1157              node->stateMachine_.SetDestroyTaskParam(true);
1158              auto func = [this, windowId]() {
1159                  auto node = windowRoot_->GetWindowNode(windowId);
1160                  if (node == nullptr) {
1161                      WLOGFD("window node is nullptr");
1162                      return;
1163                  }
1164                  if (node->GetWindowType() == WindowType::WINDOW_TYPE_DRAGGING_EFFECT) {
1165                      dragController_->FinishDrag(windowId);
1166                  }
1167                  WindowInnerManager::GetInstance().NotifyWindowRemovedOrDestroyed(windowId);
1168                  windowGroupMgr_->OnWindowDestroyed(windowId);
1169                  windowController_->DestroyWindow(windowId, node->stateMachine_.GetDestroyTaskParam());
1170              };
1171  
1172              if (node->GetWindowType() == WindowType::WINDOW_TYPE_DESKTOP) {
1173                  RemoteAnimation::OnRemoteDie(remoteObject);
1174              }
1175              if (RemoteAnimation::IsRemoteAnimationEnabledAndFirst(node->GetDisplayId()) &&
1176                  node->stateMachine_.IsRemoteAnimationPlaying()) {
1177                  WLOGI("set destroy task windowId:%{public}u", node->GetWindowId());
1178                  node->stateMachine_.SetDestroyTask(func);
1179                  handler_->PostTask(func, "destroyTimeOutTask", 6000); // 6000 is time out 6s
1180                  return;
1181              }
1182              func();
1183          };
1184          PostVoidSyncTask(task, "OnWindowEvent");
1185      }
1186  }
1187  
NotifyDisplayStateChange(DisplayId defaultDisplayId,sptr<DisplayInfo> displayInfo,const std::map<DisplayId,sptr<DisplayInfo>> & displayInfoMap,DisplayStateChangeType type)1188  void WindowManagerService::NotifyDisplayStateChange(DisplayId defaultDisplayId, sptr<DisplayInfo> displayInfo,
1189      const std::map<DisplayId, sptr<DisplayInfo>>& displayInfoMap, DisplayStateChangeType type)
1190  {
1191      HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:NotifyDisplayStateChange(%u)", type);
1192      DisplayId displayId = (displayInfo == nullptr) ? DISPLAY_ID_INVALID : displayInfo->GetDisplayId();
1193      if (type == DisplayStateChangeType::FREEZE) {
1194          freezeDisplayController_->FreezeDisplay(displayId);
1195      } else if (type == DisplayStateChangeType::UNFREEZE) {
1196          freezeDisplayController_->UnfreezeDisplay(displayId);
1197          /*
1198           * Set 'InnerInputManager Listener' to MMI, ensure that the listener
1199           * for move/drag won't be replaced by freeze-display-window
1200           */
1201          WindowInnerManager::GetInstance().SetInputEventConsumer();
1202      } else {
1203          auto task = [this, defaultDisplayId, displayInfo, displayInfoMap, type]() mutable {
1204              windowController_->NotifyDisplayStateChange(defaultDisplayId, displayInfo, displayInfoMap, type);
1205              windowGroupMgr_->OnDisplayStateChange(defaultDisplayId, displayInfo, displayInfoMap, type);
1206          };
1207          PostAsyncTask(task, "NotifyDisplayStateChange");
1208      }
1209  }
1210  
OnDisplayStateChange(DisplayId defaultDisplayId,sptr<DisplayInfo> displayInfo,const std::map<DisplayId,sptr<DisplayInfo>> & displayInfoMap,DisplayStateChangeType type)1211  void DisplayChangeListener::OnDisplayStateChange(DisplayId defaultDisplayId, sptr<DisplayInfo> displayInfo,
1212      const std::map<DisplayId, sptr<DisplayInfo>>& displayInfoMap, DisplayStateChangeType type)
1213  {
1214      WindowManagerService::GetInstance().NotifyDisplayStateChange(defaultDisplayId, displayInfo, displayInfoMap, type);
1215  }
1216  
OnScreenshot(DisplayId displayId)1217  void DisplayChangeListener::OnScreenshot(DisplayId displayId)
1218  {
1219      WindowManagerService::GetInstance().OnScreenshot(displayId);
1220  }
1221  
NotifyServerReadyToMoveOrDrag(uint32_t windowId,sptr<WindowProperty> & windowProperty,sptr<MoveDragProperty> & moveDragProperty)1222  void WindowManagerService::NotifyServerReadyToMoveOrDrag(uint32_t windowId, sptr<WindowProperty>& windowProperty,
1223      sptr<MoveDragProperty>& moveDragProperty)
1224  {
1225      if (windowProperty == nullptr || moveDragProperty == nullptr) {
1226          WLOGFE("windowProperty or moveDragProperty is invalid");
1227          return;
1228      }
1229  
1230      auto task = [this, windowId, windowProperty, moveDragProperty]() mutable {
1231          if (moveDragProperty->startDragFlag_ || moveDragProperty->startMoveFlag_) {
1232              bool res = WindowInnerManager::GetInstance().NotifyServerReadyToMoveOrDrag(windowId,
1233                  windowProperty, moveDragProperty);
1234              if (!res) {
1235                  WLOGFE("invalid operation");
1236                  return;
1237              }
1238              windowController_->InterceptInputEventToServer(windowId);
1239          }
1240          windowController_->NotifyServerReadyToMoveOrDrag(windowId, moveDragProperty);
1241      };
1242      PostAsyncTask(task, "NotifyServerReadyToMoveOrDrag");
1243  }
1244  
ProcessPointDown(uint32_t windowId,bool isPointDown)1245  void WindowManagerService::ProcessPointDown(uint32_t windowId, bool isPointDown)
1246  {
1247      auto task = [this, windowId, isPointDown]() {
1248          windowController_->ProcessPointDown(windowId, isPointDown);
1249      };
1250      PostAsyncTask(task, "ProcessPointDown");
1251  }
1252  
ProcessPointUp(uint32_t windowId)1253  void WindowManagerService::ProcessPointUp(uint32_t windowId)
1254  {
1255      auto task = [this, windowId]() {
1256          WindowInnerManager::GetInstance().NotifyWindowEndUpMovingOrDragging(windowId);
1257          windowController_->RecoverInputEventToClient(windowId);
1258          windowController_->ProcessPointUp(windowId);
1259      };
1260      PostAsyncTask(task, "ProcessPointUp");
1261  }
1262  
NotifyWindowClientPointUp(uint32_t windowId,const std::shared_ptr<MMI::PointerEvent> & pointerEvent)1263  void WindowManagerService::NotifyWindowClientPointUp(uint32_t windowId,
1264      const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
1265  {
1266      auto task = [this, windowId, pointerEvent]() mutable {
1267          windowController_->NotifyWindowClientPointUp(windowId, pointerEvent);
1268      };
1269      PostAsyncTask(task, "NotifyWindowClientPointUp");
1270  }
1271  
MinimizeAllAppWindows(DisplayId displayId)1272  WMError WindowManagerService::MinimizeAllAppWindows(DisplayId displayId)
1273  {
1274      if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1275          WLOGFE("minimize all appWindows permission denied!");
1276          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1277      }
1278      auto task = [this, displayId]() {
1279          HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:MinimizeAllAppWindows(%" PRIu64")", displayId);
1280          WLOGI("displayId %{public}" PRIu64"", displayId);
1281          windowController_->MinimizeAllAppWindows(displayId);
1282      };
1283      PostAsyncTask(task, "MinimizeAllAppWindows");
1284      return WMError::WM_OK;
1285  }
1286  
ToggleShownStateForAllAppWindows()1287  WMError WindowManagerService::ToggleShownStateForAllAppWindows()
1288  {
1289      if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1290          WLOGFE("toggle shown state for all appwindows permission denied!");
1291          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1292      }
1293      auto task = [this]() {
1294          HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:ToggleShownStateForAllAppWindows");
1295          return windowController_->ToggleShownStateForAllAppWindows();
1296      };
1297      PostAsyncTask(task, "ToggleShownStateForAllAppWindows");
1298      return WMError::WM_OK;
1299  }
1300  
GetTopWindowId(uint32_t mainWinId,uint32_t & topWinId)1301  WMError WindowManagerService::GetTopWindowId(uint32_t mainWinId, uint32_t& topWinId)
1302  {
1303      auto task = [this, &topWinId, mainWinId]() {
1304          return windowController_->GetTopWindowId(mainWinId, topWinId);
1305      };
1306      return PostSyncTask(task, "GetTopWindowId");
1307  }
1308  
SetWindowLayoutMode(WindowLayoutMode mode)1309  WMError WindowManagerService::SetWindowLayoutMode(WindowLayoutMode mode)
1310  {
1311      if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1312          WLOGFE("set window layout mode permission denied!");
1313          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1314      }
1315      auto task = [this, mode]() {
1316          WLOGI("layoutMode: %{public}u", mode);
1317          HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:SetWindowLayoutMode");
1318          return windowController_->SetWindowLayoutMode(mode);
1319      };
1320      return PostSyncTask(task, "SetWindowLayoutMode");
1321  }
1322  
UpdateProperty(sptr<WindowProperty> & windowProperty,PropertyChangeAction action,bool isAsyncTask)1323  WMError WindowManagerService::UpdateProperty(sptr<WindowProperty>& windowProperty, PropertyChangeAction action,
1324      bool isAsyncTask)
1325  {
1326      if (windowProperty == nullptr) {
1327          WLOGFE("windowProperty is nullptr");
1328          return WMError::WM_ERROR_NULLPTR;
1329      }
1330  
1331      if ((windowProperty->GetWindowFlags() == static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_FORBID_SPLIT_MOVE) ||
1332          action == PropertyChangeAction::ACTION_UPDATE_TRANSFORM_PROPERTY) &&
1333          !Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1334          WLOGFE("SetForbidSplitMove or SetShowWhenLocked or SetTranform or SetTurnScreenOn permission denied!");
1335          return WMError::WM_ERROR_INVALID_PERMISSION;
1336      }
1337  
1338      WindowType type = windowProperty->GetWindowType();
1339      if (type == WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT ||
1340          type == WindowType::WINDOW_TYPE_INPUT_METHOD_STATUS_BAR) {
1341          if (!Permission::IsStartByInputMethod()) {
1342              WLOGI("Keyboard only hide by input method it'self, operation rejected.");
1343              return WMError::WM_ERROR_INVALID_OPERATION;
1344          }
1345      } else if (!accessTokenIdMaps_.isExist(windowProperty->GetWindowId(), IPCSkeleton::GetCallingTokenID()) &&
1346          !Permission::IsSystemCalling()) {
1347          WLOGI("Operation rejected");
1348          return WMError::WM_ERROR_INVALID_OPERATION;
1349      }
1350  
1351      if (action == PropertyChangeAction::ACTION_UPDATE_PRIVACY_MODE &&
1352          !Permission::CheckCallingPermission("ohos.permission.PRIVACY_WINDOW")) {
1353          WLOGFE("Set privacy mode permission denied!");
1354          return WMError::WM_ERROR_INVALID_PERMISSION;
1355      }
1356  
1357      windowProperty->isSystemCalling_ = Permission::IsSystemCalling();
1358      if (action == PropertyChangeAction::ACTION_UPDATE_TRANSFORM_PROPERTY) {
1359          auto task = [this, windowProperty, action]() mutable {
1360              windowController_->UpdateProperty(windowProperty, action);
1361              return WMError::WM_OK;
1362          };
1363          return PostSyncTask(task, "UpdateProperty");
1364      }
1365  
1366      if (isAsyncTask || action == PropertyChangeAction::ACTION_UPDATE_RECT) {
1367          auto task = [this, windowProperty, action]() mutable {
1368              HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:UpdateProperty");
1369              WMError res = windowController_->UpdateProperty(windowProperty, action);
1370              if (action == PropertyChangeAction::ACTION_UPDATE_RECT && res == WMError::WM_OK &&
1371                  IsMoveToOrDragMove(windowProperty->GetWindowSizeChangeReason())) {
1372                  dragController_->UpdateDragInfo(windowProperty->GetWindowId());
1373              }
1374          };
1375          PostAsyncTask(task, "UpdateProperty");
1376          return WMError::WM_OK;
1377      }
1378  
1379      auto task = [this, &windowProperty, action]() {
1380          HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:UpdateProperty");
1381          WMError res = windowController_->UpdateProperty(windowProperty, action);
1382          if (action == PropertyChangeAction::ACTION_UPDATE_RECT && res == WMError::WM_OK &&
1383              IsMoveToOrDragMove(windowProperty->GetWindowSizeChangeReason())) {
1384              dragController_->UpdateDragInfo(windowProperty->GetWindowId());
1385          }
1386          return res;
1387      };
1388      return PostSyncTask(task, "UpdateProperty");
1389  }
1390  
SetWindowGravity(uint32_t windowId,WindowGravity gravity,uint32_t percent)1391  WMError WindowManagerService::SetWindowGravity(uint32_t windowId, WindowGravity gravity, uint32_t percent)
1392  {
1393      auto task = [this, windowId, gravity, percent]() {
1394          WMError res = windowController_->SetWindowGravity(windowId, gravity, percent);
1395          return res;
1396      };
1397      return PostSyncTask(task, "SetWindowGravity");
1398  }
1399  
GetAccessibilityWindowInfo(std::vector<sptr<AccessibilityWindowInfo>> & infos)1400  WMError WindowManagerService::GetAccessibilityWindowInfo(std::vector<sptr<AccessibilityWindowInfo>>& infos)
1401  {
1402      if (!Permission::IsSystemServiceCalling()) {
1403          WLOGFE("get accessibility window info permission denied!");
1404          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1405      }
1406      auto task = [this, &infos]() {
1407          return windowController_->GetAccessibilityWindowInfo(infos);
1408      };
1409      return PostSyncTask(task, "GetAccessibilityWindowInfo");
1410  }
1411  
GetUnreliableWindowInfo(int32_t windowId,std::vector<sptr<UnreliableWindowInfo>> & infos)1412  WMError WindowManagerService::GetUnreliableWindowInfo(int32_t windowId,
1413      std::vector<sptr<UnreliableWindowInfo>>& infos)
1414  {
1415      if (!Permission::IsSystemServiceCalling()) {
1416          WLOGFE("get unreliable window info permission denied!");
1417          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1418      }
1419      auto task = [this, windowId, &infos]() {
1420          return windowController_->GetUnreliableWindowInfo(windowId, infos);
1421      };
1422      return PostSyncTask(task, "GetUnreliableWindowInfo");
1423  }
1424  
GetVisibilityWindowInfo(std::vector<sptr<WindowVisibilityInfo>> & infos)1425  WMError WindowManagerService::GetVisibilityWindowInfo(std::vector<sptr<WindowVisibilityInfo>>& infos)
1426  {
1427      auto task = [this, &infos]() {
1428          return windowController_->GetVisibilityWindowInfo(infos);
1429      };
1430      return PostSyncTask(task, "GetVisibilityWindowInfo");
1431  }
1432  
1433  /** @note @window.hierarchy */
RaiseToAppTop(uint32_t windowId)1434  WMError WindowManagerService::RaiseToAppTop(uint32_t windowId)
1435  {
1436      auto task = [this, windowId]() {
1437          return windowController_->RaiseToAppTop(windowId);
1438      };
1439      return PostSyncTask(task, "RaiseToAppTop");
1440  }
1441  
GetSnapshot(int32_t windowId)1442  std::shared_ptr<Media::PixelMap> WindowManagerService::GetSnapshot(int32_t windowId)
1443  {
1444      if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1445          WLOGFE("permission denied!");
1446          return nullptr;
1447      }
1448      auto task = [this, windowId]() {
1449          return windowController_->GetSnapshot(windowId);
1450      };
1451      return PostSyncTask(task, "GetSnapshot");
1452  }
1453  
DispatchKeyEvent(uint32_t windowId,std::shared_ptr<MMI::KeyEvent> event)1454  void WindowManagerService::DispatchKeyEvent(uint32_t windowId, std::shared_ptr<MMI::KeyEvent> event)
1455  {
1456      auto task = [this, windowId, event]() {
1457          windowController_->DispatchKeyEvent(windowId, event);
1458      };
1459      PostVoidSyncTask(task, "DispatchKeyEvent");
1460  }
1461  
NotifyDumpInfoResult(const std::vector<std::string> & info)1462  void WindowManagerService::NotifyDumpInfoResult(const std::vector<std::string>& info)
1463  {
1464      if (windowDumper_) {
1465          windowDumper_->dumpInfoFuture_.SetValue(info);
1466      }
1467  }
1468  
GetWindowAnimationTargets(std::vector<uint32_t> missionIds,std::vector<sptr<RSWindowAnimationTarget>> & targets)1469  WMError WindowManagerService::GetWindowAnimationTargets(std::vector<uint32_t> missionIds,
1470      std::vector<sptr<RSWindowAnimationTarget>>& targets)
1471  {
1472      if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1473          WLOGFE("get window animation targets permission denied!");
1474          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1475      }
1476      auto task = [this, missionIds, &targets]() {
1477          return RemoteAnimation::GetWindowAnimationTargets(missionIds, targets);
1478      };
1479      return PostSyncTask(task, "GetWindowAnimationTargets");
1480  }
1481  
GetSystemConfig(SystemConfig & systemConfig)1482  WMError WindowManagerService::GetSystemConfig(SystemConfig& systemConfig)
1483  {
1484      systemConfig = systemConfig_;
1485      return WMError::WM_OK;
1486  }
1487  
GetModeChangeHotZones(DisplayId displayId,ModeChangeHotZones & hotZones)1488  WMError WindowManagerService::GetModeChangeHotZones(DisplayId displayId, ModeChangeHotZones& hotZones)
1489  {
1490      if (!hotZonesConfig_.isModeChangeHotZoneConfigured_) {
1491          return WMError::WM_DO_NOTHING;
1492      }
1493  
1494      return windowController_->GetModeChangeHotZones(displayId, hotZones, hotZonesConfig_);
1495  }
1496  
MinimizeWindowsByLauncher(std::vector<uint32_t> windowIds,bool isAnimated,sptr<RSIWindowAnimationFinishedCallback> & finishCallback)1497  void WindowManagerService::MinimizeWindowsByLauncher(std::vector<uint32_t> windowIds, bool isAnimated,
1498      sptr<RSIWindowAnimationFinishedCallback>& finishCallback)
1499  {
1500      if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1501          WLOGFE("minimize windows by launcher permission denied!");
1502          return;
1503      }
1504      auto task = [this, windowIds, isAnimated, &finishCallback]() mutable {
1505          windowController_->MinimizeWindowsByLauncher(windowIds, isAnimated, finishCallback);
1506      };
1507      PostVoidSyncTask(task, "MinimizeWindowsByLauncher");
1508  }
1509  
UpdateAvoidAreaListener(uint32_t windowId,bool haveAvoidAreaListener)1510  WMError WindowManagerService::UpdateAvoidAreaListener(uint32_t windowId, bool haveAvoidAreaListener)
1511  {
1512      auto task = [this, windowId, haveAvoidAreaListener]() {
1513          sptr<WindowNode> node = windowRoot_->GetWindowNode(windowId);
1514          if (node == nullptr) {
1515              WLOGFE("get window node failed. win %{public}u", windowId);
1516              return WMError::WM_DO_NOTHING;
1517          }
1518          sptr<WindowNodeContainer> container = windowRoot_->GetWindowNodeContainer(node->GetDisplayId());
1519          if (container == nullptr) {
1520              WLOGFE("get container failed. win %{public}u display %{public}" PRIu64"", windowId, node->GetDisplayId());
1521              return WMError::WM_DO_NOTHING;
1522          }
1523          container->UpdateAvoidAreaListener(node, haveAvoidAreaListener);
1524          return WMError::WM_OK;
1525      };
1526      return PostSyncTask(task, "UpdateAvoidAreaListener");
1527  }
1528  
SetAnchorAndScale(int32_t x,int32_t y,float scale)1529  void WindowManagerService::SetAnchorAndScale(int32_t x, int32_t y, float scale)
1530  {
1531      auto task = [this, x, y, scale]() {
1532          windowController_->SetAnchorAndScale(x, y, scale);
1533      };
1534      PostAsyncTask(task, "SetAnchorAndScale");
1535  }
1536  
SetAnchorOffset(int32_t deltaX,int32_t deltaY)1537  void WindowManagerService::SetAnchorOffset(int32_t deltaX, int32_t deltaY)
1538  {
1539      auto task = [this, deltaX, deltaY]() {
1540          windowController_->SetAnchorOffset(deltaX, deltaY);
1541      };
1542      PostAsyncTask(task, "SetAnchorOffset");
1543  }
1544  
OffWindowZoom()1545  void WindowManagerService::OffWindowZoom()
1546  {
1547      auto task = [this]() {
1548          windowController_->OffWindowZoom();
1549      };
1550      PostAsyncTask(task, "OffWindowZoom");
1551  }
1552  
UpdateRsTree(uint32_t windowId,bool isAdd)1553  WMError WindowManagerService::UpdateRsTree(uint32_t windowId, bool isAdd)
1554  {
1555      auto task = [this, windowId, isAdd]() {
1556          return windowRoot_->UpdateRsTree(windowId, isAdd);
1557      };
1558      return PostSyncTask(task, "UpdateRsTree");
1559  }
1560  
OnScreenshot(DisplayId displayId)1561  void WindowManagerService::OnScreenshot(DisplayId displayId)
1562  {
1563      auto task = [this, displayId]() {
1564          windowController_->OnScreenshot(displayId);
1565      };
1566      PostAsyncTask(task, "OnScreenshot");
1567  }
1568  
BindDialogTarget(uint32_t & windowId,sptr<IRemoteObject> targetToken)1569  WMError WindowManagerService::BindDialogTarget(uint32_t& windowId, sptr<IRemoteObject> targetToken)
1570  {
1571      if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1572          WLOGFE("bind dialog target permission denied!");
1573          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1574      }
1575      auto task = [this, &windowId, targetToken]() {
1576          return windowController_->BindDialogTarget(windowId, targetToken);
1577      };
1578      return PostSyncTask(task, "BindDialogTarget");
1579  }
1580  
HasPrivateWindow(DisplayId displayId,bool & hasPrivateWindow)1581  void WindowManagerService::HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow)
1582  {
1583      auto task = [this, displayId, &hasPrivateWindow]() mutable {
1584          hasPrivateWindow = windowRoot_->HasPrivateWindow(displayId);
1585      };
1586      PostVoidSyncTask(task, "HasPrivateWindow");
1587      WLOGI("called %{public}u", hasPrivateWindow);
1588  }
1589  
SetGestureNavigaionEnabled(bool enable)1590  WMError WindowManagerService::SetGestureNavigaionEnabled(bool enable)
1591  {
1592      if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1593          WLOGFE("permission denied!");
1594          return WMError::WM_ERROR_NOT_SYSTEM_APP;
1595      }
1596      auto task = [this, enable]() {
1597          return windowRoot_->SetGestureNavigaionEnabled(enable);
1598      };
1599      return PostSyncTask(task, "SetGestureNavigaionEnabled");
1600  }
1601  
HasPrivateWindow(DisplayId displayId,bool & hasPrivateWindow)1602  void WindowInfoQueriedListener::HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow)
1603  {
1604      WLOGI("called");
1605      WindowManagerService::GetInstance().HasPrivateWindow(displayId, hasPrivateWindow);
1606  }
1607  
SetMaximizeMode(MaximizeMode maximizeMode)1608  void WindowManagerService::SetMaximizeMode(MaximizeMode maximizeMode)
1609  {
1610      maximizeMode_ = maximizeMode;
1611      int32_t storageMode = -1;
1612      if (PersistentStorage::HasKey("maximize_state", PersistentStorageType::MAXIMIZE_STATE)) {
1613          PersistentStorage::Get("maximize_state", storageMode, PersistentStorageType::MAXIMIZE_STATE);
1614          PersistentStorage::Delete("maximize_state", PersistentStorageType::MAXIMIZE_STATE);
1615      }
1616      PersistentStorage::Insert("maximize_state", static_cast<int32_t>(maximizeMode),
1617          PersistentStorageType::MAXIMIZE_STATE);
1618      WLOGI("globalMaximizeMode changed from %{public}d to %{public}d", storageMode, static_cast<int32_t>(maximizeMode));
1619  }
1620  
GetMaximizeMode()1621  MaximizeMode WindowManagerService::GetMaximizeMode()
1622  {
1623      return maximizeMode_;
1624  }
1625  
GetFocusWindowInfo(FocusChangeInfo & focusInfo)1626  void WindowManagerService::GetFocusWindowInfo(FocusChangeInfo& focusInfo)
1627  {
1628      WLOGFD("Get Focus window info in wms");
1629      windowController_->GetFocusWindowInfo(focusInfo);
1630  }
1631  } // namespace Rosen
1632  } // namespace OHOS
1633