1  /*
2   * Copyright (c) 2023 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 "js_scene_utils.h"
17  #include "js_scene_session.h"
18  
19  #include "pixel_map_napi.h"
20  #include "session/host/include/session.h"
21  #include "session_manager/include/scene_session_manager.h"
22  #include "window_manager_hilog.h"
23  #include "common/include/session_permission.h"
24  
25  namespace OHOS::Rosen {
26  using namespace AbilityRuntime;
27  namespace {
28  constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, HILOG_DOMAIN_WINDOW, "JsSceneSession" };
29  const std::string PENDING_SCENE_CB = "pendingSceneSessionActivation";
30  const std::string CHANGE_SESSION_VISIBILITY_WITH_STATUS_BAR = "changeSessionVisibilityWithStatusBar";
31  const std::string SESSION_STATE_CHANGE_CB = "sessionStateChange";
32  const std::string BUFFER_AVAILABLE_CHANGE_CB = "bufferAvailableChange";
33  const std::string SESSION_EVENT_CB = "sessionEvent";
34  const std::string SESSION_RECT_CHANGE_CB = "sessionRectChange";
35  const std::string SESSION_PIP_CONTROL_STATUS_CHANGE_CB = "sessionPiPControlStatusChange";
36  const std::string SESSION_AUTO_START_PIP_CB = "autoStartPiP";
37  const std::string CREATE_SUB_SESSION_CB = "createSpecificSession";
38  const std::string BIND_DIALOG_TARGET_CB = "bindDialogTarget";
39  const std::string RAISE_TO_TOP_CB = "raiseToTop";
40  const std::string RAISE_TO_TOP_POINT_DOWN_CB = "raiseToTopForPointDown";
41  const std::string BACK_PRESSED_CB = "backPressed";
42  const std::string SESSION_FOCUSABLE_CHANGE_CB = "sessionFocusableChange";
43  const std::string SESSION_TOUCHABLE_CHANGE_CB = "sessionTouchableChange";
44  const std::string SESSION_TOP_MOST_CHANGE_CB = "sessionTopmostChange";
45  const std::string SUB_MODAL_TYPE_CHANGE_CB = "subModalTypeChange";
46  const std::string MAIN_MODAL_TYPE_CHANGE_CB = "mainModalTypeChange";
47  const std::string CLICK_CB = "click";
48  const std::string TERMINATE_SESSION_CB = "terminateSession";
49  const std::string TERMINATE_SESSION_CB_NEW = "terminateSessionNew";
50  const std::string TERMINATE_SESSION_CB_TOTAL = "terminateSessionTotal";
51  const std::string UPDATE_SESSION_LABEL_CB = "updateSessionLabel";
52  const std::string UPDATE_SESSION_ICON_CB = "updateSessionIcon";
53  const std::string SESSION_EXCEPTION_CB = "sessionException";
54  const std::string SYSTEMBAR_PROPERTY_CHANGE_CB = "systemBarPropertyChange";
55  const std::string NEED_AVOID_CB = "needAvoid";
56  const std::string PENDING_SESSION_TO_FOREGROUND_CB = "pendingSessionToForeground";
57  const std::string PENDING_SESSION_TO_BACKGROUND_FOR_DELEGATOR_CB = "pendingSessionToBackgroundForDelegator";
58  const std::string CUSTOM_ANIMATION_PLAYING_CB = "isCustomAnimationPlaying";
59  const std::string NEED_DEFAULT_ANIMATION_FLAG_CHANGE_CB = "needDefaultAnimationFlagChange";
60  const std::string SHOW_WHEN_LOCKED_CB = "sessionShowWhenLockedChange";
61  const std::string REQUESTED_ORIENTATION_CHANGE_CB = "sessionRequestedOrientationChange";
62  const std::string RAISE_ABOVE_TARGET_CB = "raiseAboveTarget";
63  const std::string FORCE_HIDE_CHANGE_CB = "sessionForceHideChange";
64  const std::string WINDOW_DRAG_HOT_AREA_CB = "windowDragHotArea";
65  const std::string TOUCH_OUTSIDE_CB = "touchOutside";
66  const std::string SESSIONINFO_LOCKEDSTATE_CHANGE_CB = "sessionInfoLockedStateChange";
67  const std::string PREPARE_CLOSE_PIP_SESSION = "prepareClosePiPSession";
68  const std::string LANDSCAPE_MULTI_WINDOW_CB = "landscapeMultiWindow";
69  const std::string CONTEXT_TRANSPARENT_CB = "contextTransparent";
70  const std::string KEYBOARD_GRAVITY_CHANGE_CB = "keyboardGravityChange";
71  const std::string ADJUST_KEYBOARD_LAYOUT_CB = "adjustKeyboardLayout";
72  const std::string LAYOUT_FULL_SCREEN_CB = "layoutFullScreenChange";
73  const std::string DEFAULT_DENSITY_ENABLED_CB = "defaultDensityEnabled";
74  const std::string TITLE_DOCK_HOVER_SHOW_CB = "titleAndDockHoverShowChange";
75  const std::string NEXT_FRAME_LAYOUT_FINISH_CB = "nextFrameLayoutFinish";
76  const std::string MAIN_WINDOW_TOP_MOST_CHANGE_CB = "mainWindowTopmostChange";
77  const std::string SET_WINDOW_RECT_AUTO_SAVE_CB = "setWindowRectAutoSave";
78  const std::string UPDATE_APP_USE_CONTROL_CB = "updateAppUseControl";
79  const std::string RESTORE_MAIN_WINDOW_CB = "restoreMainWindow";
80  constexpr int ARG_COUNT_3 = 3;
81  constexpr int ARG_COUNT_4 = 4;
82  constexpr int ARG_INDEX_0 = 0;
83  constexpr int ARG_INDEX_1 = 1;
84  constexpr int ARG_INDEX_2 = 2;
85  constexpr int ARG_INDEX_3 = 3;
86  
87  const std::map<std::string, ListenerFuncType> ListenerFuncMap {
88      {PENDING_SCENE_CB,                      ListenerFuncType::PENDING_SCENE_CB},
89      {CHANGE_SESSION_VISIBILITY_WITH_STATUS_BAR,
90          ListenerFuncType::CHANGE_SESSION_VISIBILITY_WITH_STATUS_BAR},
91      {SESSION_STATE_CHANGE_CB,               ListenerFuncType::SESSION_STATE_CHANGE_CB},
92      {BUFFER_AVAILABLE_CHANGE_CB,            ListenerFuncType::BUFFER_AVAILABLE_CHANGE_CB},
93      {SESSION_EVENT_CB,                      ListenerFuncType::SESSION_EVENT_CB},
94      {SESSION_RECT_CHANGE_CB,                ListenerFuncType::SESSION_RECT_CHANGE_CB},
95      {SESSION_PIP_CONTROL_STATUS_CHANGE_CB,  ListenerFuncType::SESSION_PIP_CONTROL_STATUS_CHANGE_CB},
96      {SESSION_AUTO_START_PIP_CB,             ListenerFuncType::SESSION_AUTO_START_PIP_CB},
97      {CREATE_SUB_SESSION_CB,                 ListenerFuncType::CREATE_SUB_SESSION_CB},
98      {BIND_DIALOG_TARGET_CB,                 ListenerFuncType::BIND_DIALOG_TARGET_CB},
99      {RAISE_TO_TOP_CB,                       ListenerFuncType::RAISE_TO_TOP_CB},
100      {RAISE_TO_TOP_POINT_DOWN_CB,            ListenerFuncType::RAISE_TO_TOP_POINT_DOWN_CB},
101      {BACK_PRESSED_CB,                       ListenerFuncType::BACK_PRESSED_CB},
102      {SESSION_FOCUSABLE_CHANGE_CB,           ListenerFuncType::SESSION_FOCUSABLE_CHANGE_CB},
103      {SESSION_TOUCHABLE_CHANGE_CB,           ListenerFuncType::SESSION_TOUCHABLE_CHANGE_CB},
104      {SESSION_TOP_MOST_CHANGE_CB,            ListenerFuncType::SESSION_TOP_MOST_CHANGE_CB},
105      {SUB_MODAL_TYPE_CHANGE_CB,              ListenerFuncType::SUB_MODAL_TYPE_CHANGE_CB},
106      {MAIN_MODAL_TYPE_CHANGE_CB,             ListenerFuncType::MAIN_MODAL_TYPE_CHANGE_CB},
107      {CLICK_CB,                              ListenerFuncType::CLICK_CB},
108      {TERMINATE_SESSION_CB,                  ListenerFuncType::TERMINATE_SESSION_CB},
109      {TERMINATE_SESSION_CB_NEW,              ListenerFuncType::TERMINATE_SESSION_CB_NEW},
110      {TERMINATE_SESSION_CB_TOTAL,            ListenerFuncType::TERMINATE_SESSION_CB_TOTAL},
111      {SESSION_EXCEPTION_CB,                  ListenerFuncType::SESSION_EXCEPTION_CB},
112      {UPDATE_SESSION_LABEL_CB,               ListenerFuncType::UPDATE_SESSION_LABEL_CB},
113      {UPDATE_SESSION_ICON_CB,                ListenerFuncType::UPDATE_SESSION_ICON_CB},
114      {SYSTEMBAR_PROPERTY_CHANGE_CB,          ListenerFuncType::SYSTEMBAR_PROPERTY_CHANGE_CB},
115      {NEED_AVOID_CB,                         ListenerFuncType::NEED_AVOID_CB},
116      {PENDING_SESSION_TO_FOREGROUND_CB,      ListenerFuncType::PENDING_SESSION_TO_FOREGROUND_CB},
117      {PENDING_SESSION_TO_BACKGROUND_FOR_DELEGATOR_CB,
118          ListenerFuncType::PENDING_SESSION_TO_BACKGROUND_FOR_DELEGATOR_CB},
119      {CUSTOM_ANIMATION_PLAYING_CB,           ListenerFuncType::CUSTOM_ANIMATION_PLAYING_CB},
120      {NEED_DEFAULT_ANIMATION_FLAG_CHANGE_CB, ListenerFuncType::NEED_DEFAULT_ANIMATION_FLAG_CHANGE_CB},
121      {SHOW_WHEN_LOCKED_CB,                   ListenerFuncType::SHOW_WHEN_LOCKED_CB},
122      {REQUESTED_ORIENTATION_CHANGE_CB,       ListenerFuncType::REQUESTED_ORIENTATION_CHANGE_CB},
123      {RAISE_ABOVE_TARGET_CB,                 ListenerFuncType::RAISE_ABOVE_TARGET_CB},
124      {FORCE_HIDE_CHANGE_CB,                  ListenerFuncType::FORCE_HIDE_CHANGE_CB},
125      {WINDOW_DRAG_HOT_AREA_CB,               ListenerFuncType::WINDOW_DRAG_HOT_AREA_CB},
126      {TOUCH_OUTSIDE_CB,                      ListenerFuncType::TOUCH_OUTSIDE_CB},
127      {SESSIONINFO_LOCKEDSTATE_CHANGE_CB,     ListenerFuncType::SESSIONINFO_LOCKEDSTATE_CHANGE_CB},
128      {PREPARE_CLOSE_PIP_SESSION,             ListenerFuncType::PREPARE_CLOSE_PIP_SESSION},
129      {LANDSCAPE_MULTI_WINDOW_CB,             ListenerFuncType::LANDSCAPE_MULTI_WINDOW_CB},
130      {CONTEXT_TRANSPARENT_CB,                ListenerFuncType::CONTEXT_TRANSPARENT_CB},
131      {KEYBOARD_GRAVITY_CHANGE_CB,            ListenerFuncType::KEYBOARD_GRAVITY_CHANGE_CB},
132      {ADJUST_KEYBOARD_LAYOUT_CB,             ListenerFuncType::ADJUST_KEYBOARD_LAYOUT_CB},
133      {LAYOUT_FULL_SCREEN_CB,                 ListenerFuncType::LAYOUT_FULL_SCREEN_CB},
134      {DEFAULT_DENSITY_ENABLED_CB,            ListenerFuncType::DEFAULT_DENSITY_ENABLED_CB},
135      {TITLE_DOCK_HOVER_SHOW_CB,              ListenerFuncType::TITLE_DOCK_HOVER_SHOW_CB},
136      {NEXT_FRAME_LAYOUT_FINISH_CB,           ListenerFuncType::NEXT_FRAME_LAYOUT_FINISH_CB},
137      {MAIN_WINDOW_TOP_MOST_CHANGE_CB,        ListenerFuncType::MAIN_WINDOW_TOP_MOST_CHANGE_CB},
138      {SET_WINDOW_RECT_AUTO_SAVE_CB,          ListenerFuncType::SET_WINDOW_RECT_AUTO_SAVE_CB},
139      {UPDATE_APP_USE_CONTROL_CB,             ListenerFuncType::UPDATE_APP_USE_CONTROL_CB},
140      {RESTORE_MAIN_WINDOW_CB,                ListenerFuncType::RESTORE_MAIN_WINDOW_CB},
141  };
142  
143  const std::vector<std::string> g_syncGlobalPositionPermission {
144      "Recent",
145  };
146  } // namespace
147  
148  std::map<int32_t, napi_ref> JsSceneSession::jsSceneSessionMap_;
149  
CreateJsPiPControlStatusObject(napi_env env,PiPControlStatusInfo controlStatusInfo)150  napi_value CreateJsPiPControlStatusObject(napi_env env, PiPControlStatusInfo controlStatusInfo)
151  {
152      TLOGI(WmsLogTag::WMS_PIP, "called");
153      napi_value objValue = nullptr;
154      napi_create_object(env, &objValue);
155      if (objValue == nullptr) {
156          TLOGE(WmsLogTag::WMS_PIP, "objValue is nullptr");
157          return NapiGetUndefined(env);
158      }
159      uint32_t controlType = static_cast<uint32_t>(controlStatusInfo.controlType);
160      int32_t status = static_cast<int32_t>(controlStatusInfo.status);
161      napi_set_named_property(env, objValue, "controlType", CreateJsValue(env, controlType));
162      napi_set_named_property(env, objValue, "status", CreateJsValue(env, status));
163      return objValue;
164  }
165  
CreateJsPiPControlEnableObject(napi_env env,PiPControlEnableInfo controlEnableInfo)166  napi_value CreateJsPiPControlEnableObject(napi_env env, PiPControlEnableInfo controlEnableInfo)
167  {
168      TLOGI(WmsLogTag::WMS_PIP, "called");
169      napi_value objValue = nullptr;
170      napi_create_object(env, &objValue);
171      if (objValue == nullptr) {
172          TLOGE(WmsLogTag::WMS_PIP, "objValue is nullptr");
173          return NapiGetUndefined(env);
174      }
175      uint32_t controlType = static_cast<uint32_t>(controlEnableInfo.controlType);
176      int32_t enabled = static_cast<int32_t>(controlEnableInfo.enabled);
177      napi_set_named_property(env, objValue, "controlType", CreateJsValue(env, controlType));
178      napi_set_named_property(env, objValue, "enabled", CreateJsValue(env, enabled));
179      return objValue;
180  }
181  
CreatePipTemplateInfo(napi_env env,const sptr<SceneSession> & session)182  static napi_value CreatePipTemplateInfo(napi_env env, const sptr<SceneSession>& session)
183  {
184      TLOGI(WmsLogTag::WMS_PIP, "called");
185      napi_value pipTemplateInfoValue = nullptr;
186      napi_create_object(env, &pipTemplateInfoValue);
187      napi_set_named_property(env, pipTemplateInfoValue, "pipTemplateType",
188          CreateJsValue(env, session->GetPiPTemplateInfo().pipTemplateType));
189      napi_set_named_property(env, pipTemplateInfoValue, "priority",
190          CreateJsValue(env, session->GetPiPTemplateInfo().priority));
191      napi_value controlArrayValue = nullptr;
192      std::vector<std::uint32_t> controlGroups = session->GetPiPTemplateInfo().controlGroup;
193      napi_create_array_with_length(env, controlGroups.size(), &controlArrayValue);
194      auto index = 0;
195      for (const auto& controlGroup : controlGroups) {
196          napi_set_element(env, controlArrayValue, index++, CreateJsValue(env, controlGroup));
197      }
198      napi_set_named_property(env, pipTemplateInfoValue, "controlGroup", controlArrayValue);
199      napi_value controlStatusArrayValue = nullptr;
200      std::vector<PiPControlStatusInfo> controlStatusInfoList = session->GetPiPTemplateInfo().pipControlStatusInfoList;
201      napi_create_array_with_length(env, controlStatusInfoList.size(), &controlStatusArrayValue);
202      auto controlStatusIndex = 0;
203      for (const auto& controlStatus : controlStatusInfoList) {
204          napi_set_element(env, controlStatusArrayValue, controlStatusIndex++,
205              CreateJsPiPControlStatusObject(env, controlStatus));
206      }
207      napi_set_named_property(env, pipTemplateInfoValue, "pipControlStatusInfoList", controlStatusArrayValue);
208      napi_value controlEnableArrayValue = nullptr;
209      std::vector<PiPControlEnableInfo> controlEnableInfoList = session->GetPiPTemplateInfo().pipControlEnableInfoList;
210      napi_create_array_with_length(env, controlEnableInfoList.size(), &controlEnableArrayValue);
211      auto controlEnableIndex = 0;
212      for (const auto& controlEnableInfo : controlEnableInfoList) {
213          napi_set_element(env, controlEnableArrayValue, controlEnableIndex++,
214              CreateJsPiPControlEnableObject(env, controlEnableInfo));
215      }
216      napi_set_named_property(env, pipTemplateInfoValue, "pipControlEnableInfoList", controlEnableArrayValue);
217      return pipTemplateInfoValue;
218  }
219  
SetWindowSizeAndPosition(napi_env env,napi_value objValue,const sptr<SceneSession> & session)220  static void SetWindowSizeAndPosition(napi_env env, napi_value objValue, const sptr<SceneSession>& session)
221  {
222      auto abilityInfo = session->GetSessionInfo().abilityInfo;
223      if (!abilityInfo) {
224          TLOGW(WmsLogTag::WMS_LAYOUT, "abilityInfo is nullptr");
225          return;
226      }
227      uint32_t value = 0;
228      for (const auto& item : abilityInfo->metadata) {
229          if (item.name == "ohos.ability.window.width") {
230              if (GetIntValueFromString(item.value, value) == WSError::WS_OK) {
231                  TLOGI(WmsLogTag::WMS_LAYOUT, "ohos.ability.window.width = %{public}d", value);
232                  napi_set_named_property(env, objValue, "windowWidth", CreateJsValue(env, value));
233              }
234          } else if (item.name == "ohos.ability.window.height") {
235              if (GetIntValueFromString(item.value, value) == WSError::WS_OK) {
236                  TLOGI(WmsLogTag::WMS_LAYOUT, "ohos.ability.window.height = %{public}d", value);
237                  napi_set_named_property(env, objValue, "windowHeight", CreateJsValue(env, value));
238              }
239          } else if (item.name == "ohos.ability.window.left") {
240              if (item.value.size() > 0) {
241                  TLOGI(WmsLogTag::WMS_LAYOUT, "ohos.ability.window.left = %{public}s", item.value.c_str());
242                  napi_set_named_property(env, objValue, "windowLeft", CreateJsValue(env, item.value));
243              }
244          } else if (item.name == "ohos.ability.window.top") {
245              if (item.value.size() > 0) {
246                  TLOGI(WmsLogTag::WMS_LAYOUT, "ohos.ability.window.top = %{public}s", item.value.c_str());
247                  napi_set_named_property(env, objValue, "windowTop", CreateJsValue(env, item.value));
248              }
249          }
250      }
251  }
252  
Create(napi_env env,const sptr<SceneSession> & session)253  napi_value JsSceneSession::Create(napi_env env, const sptr<SceneSession>& session)
254  {
255      napi_value objValue = nullptr;
256      napi_create_object(env, &objValue);
257      if (objValue == nullptr || session == nullptr) {
258          WLOGFE("[NAPI]Object or session is null!");
259          return NapiGetUndefined(env);
260      }
261  
262      sptr<JsSceneSession> jsSceneSession = sptr<JsSceneSession>::MakeSptr(env, session);
263      jsSceneSession->IncStrongRef(nullptr);
264      napi_wrap(env, objValue, jsSceneSession.GetRefPtr(), JsSceneSession::Finalizer, nullptr, nullptr);
265      napi_set_named_property(env, objValue, "persistentId",
266          CreateJsValue(env, static_cast<int32_t>(session->GetPersistentId())));
267      napi_set_named_property(env, objValue, "parentId",
268          CreateJsValue(env, static_cast<int32_t>(session->GetParentPersistentId())));
269      napi_set_named_property(env, objValue, "type",
270          CreateJsValue(env, static_cast<uint32_t>(GetApiType(session->GetWindowType()))));
271      napi_set_named_property(env, objValue, "isAppType", CreateJsValue(env, session->IsFloatingWindowAppType()));
272      napi_set_named_property(env, objValue, "pipTemplateInfo", CreatePipTemplateInfo(env, session));
273      napi_set_named_property(env, objValue, "keyboardGravity",
274          CreateJsValue(env, static_cast<int32_t>(session->GetKeyboardGravity())));
275      napi_set_named_property(env, objValue, "isTopmost",
276          CreateJsValue(env, static_cast<int32_t>(session->IsTopmost())));
277      napi_set_named_property(env, objValue, "isMainWindowTopmost",
278          CreateJsValue(env, static_cast<int32_t>(session->IsMainWindowTopmost())));
279      napi_set_named_property(env, objValue, "subWindowModalType",
280          CreateJsValue(env, static_cast<int32_t>(session->GetSubWindowModalType())));
281      SetWindowSizeAndPosition(env, objValue, session);
282      const char* moduleName = "JsSceneSession";
283      BindNativeMethod(env, objValue, moduleName);
284      BindNativeMethodForKeyboard(env, objValue, moduleName);
285      BindNativeMethodForCompatiblePcMode(env, objValue, moduleName);
286      BindNativeMethodForSCBSystemSession(env, objValue, moduleName);
287      BindNativeMethodForFocus(env, objValue, moduleName);
288      napi_ref jsRef = nullptr;
289      napi_status status = napi_create_reference(env, objValue, 1, &jsRef);
290      if (status != napi_ok) {
291          WLOGFE("do not get ref ");
292      }
293      jsSceneSessionMap_[session->GetPersistentId()] = jsRef;
294      BindNativeFunction(env, objValue, "updateSizeChangeReason", moduleName, JsSceneSession::UpdateSizeChangeReason);
295      return objValue;
296  }
297  
BindNativeMethod(napi_env env,napi_value objValue,const char * moduleName)298  void JsSceneSession::BindNativeMethod(napi_env env, napi_value objValue, const char* moduleName)
299  {
300      BindNativeFunction(env, objValue, "on", moduleName, JsSceneSession::RegisterCallback);
301      BindNativeFunction(env, objValue, "updateNativeVisibility", moduleName, JsSceneSession::UpdateNativeVisibility);
302      BindNativeFunction(env, objValue, "setShowRecent", moduleName, JsSceneSession::SetShowRecent);
303      BindNativeFunction(env, objValue, "setZOrder", moduleName, JsSceneSession::SetZOrder);
304      BindNativeFunction(env, objValue, "setTouchable", moduleName, JsSceneSession::SetTouchable);
305      BindNativeFunction(env, objValue, "setSystemActive", moduleName, JsSceneSession::SetSystemActive);
306      BindNativeFunction(env, objValue, "setPrivacyMode", moduleName, JsSceneSession::SetPrivacyMode);
307      BindNativeFunction(env, objValue, "setSystemSceneOcclusionAlpha",
308          moduleName, JsSceneSession::SetSystemSceneOcclusionAlpha);
309      BindNativeFunction(env, objValue, "setSystemSceneForceUIFirst",
310          moduleName, JsSceneSession::SetSystemSceneForceUIFirst);
311      BindNativeFunction(env, objValue, "markSystemSceneUIFirst",
312          moduleName, JsSceneSession::MarkSystemSceneUIFirst);
313      BindNativeFunction(env, objValue, "setFloatingScale", moduleName, JsSceneSession::SetFloatingScale);
314      BindNativeFunction(env, objValue, "setIsMidScene", moduleName, JsSceneSession::SetIsMidScene);
315      BindNativeFunction(env, objValue, "setScale", moduleName, JsSceneSession::SetScale);
316      BindNativeFunction(env, objValue, "setWindowLastSafeRect", moduleName, JsSceneSession::SetWindowLastSafeRect);
317      BindNativeFunction(env, objValue, "setOffset", moduleName, JsSceneSession::SetOffset);
318      BindNativeFunction(env, objValue, "setExitSplitOnBackground", moduleName,
319          JsSceneSession::SetExitSplitOnBackground);
320      BindNativeFunction(env, objValue, "setWaterMarkFlag", moduleName, JsSceneSession::SetWaterMarkFlag);
321      BindNativeFunction(env, objValue, "setPipActionEvent", moduleName, JsSceneSession::SetPipActionEvent);
322      BindNativeFunction(env, objValue, "setPiPControlEvent", moduleName, JsSceneSession::SetPiPControlEvent);
323      BindNativeFunction(env, objValue, "notifyPipOcclusionChange", moduleName, JsSceneSession::NotifyPipOcclusionChange);
324      BindNativeFunction(env, objValue, "notifyDisplayStatusBarTemporarily", moduleName,
325          JsSceneSession::NotifyDisplayStatusBarTemporarily);
326      BindNativeFunction(env, objValue, "setTemporarilyShowWhenLocked", moduleName,
327          JsSceneSession::SetTemporarilyShowWhenLocked);
328      BindNativeFunction(env, objValue, "setSkipDraw", moduleName,
329          JsSceneSession::SetSkipDraw);
330      BindNativeFunction(env, objValue, "setSkipSelfWhenShowOnVirtualScreen", moduleName,
331          JsSceneSession::SetSkipSelfWhenShowOnVirtualScreen);
332      BindNativeFunction(env, objValue, "setCompatibleModeInPc", moduleName,
333          JsSceneSession::SetCompatibleModeInPc);
334      BindNativeFunction(env, objValue, "setUniqueDensityDpiFromSCB", moduleName,
335          JsSceneSession::SetUniqueDensityDpiFromSCB);
336      BindNativeFunction(env, objValue, "setBlankFlag", moduleName, JsSceneSession::SetBlankFlag);
337      BindNativeFunction(env, objValue, "removeBlank", moduleName, JsSceneSession::RemoveBlank);
338      BindNativeFunction(env, objValue, "setBufferAvailableCallbackEnable", moduleName,
339          JsSceneSession::SetBufferAvailableCallbackEnable);
340      BindNativeFunction(env, objValue, "isDeviceWakeupByApplication", moduleName,
341          JsSceneSession::IsDeviceWakeupByApplication);
342      BindNativeFunction(env, objValue, "syncDefaultRequestedOrientation", moduleName,
343          JsSceneSession::SyncDefaultRequestedOrientation);
344      BindNativeFunction(env, objValue, "setIsPcAppInPad", moduleName,
345          JsSceneSession::SetIsPcAppInPad);
346      BindNativeFunction(env, objValue, "setCompatibleModeEnableInPad", moduleName,
347          JsSceneSession::SetCompatibleModeEnableInPad);
348      BindNativeFunction(env, objValue, "setStartingWindowExitAnimationFlag", moduleName,
349          JsSceneSession::SetStartingWindowExitAnimationFlag);
350      BindNativeFunction(env, objValue, "setNeedSyncSessionRect", moduleName,
351          JsSceneSession::SetNeedSyncSessionRect);
352      BindNativeFunction(env, objValue, "setWindowEnableDragBySystem", moduleName,
353          JsSceneSession::SetWindowEnableDragBySystem);
354      BindNativeFunction(env, objValue, "setIsActivatedAfterScreenLocked", moduleName,
355          JsSceneSession::SetIsActivatedAfterScreenLocked);
356      BindNativeFunction(env, objValue, "setFrameGravity", moduleName,
357          JsSceneSession::SetFrameGravity);
358      BindNativeFunction(env, objValue, "setUseStartingWindowAboveLocked", moduleName,
359          JsSceneSession::SetUseStartingWindowAboveLocked);
360      BindNativeFunction(env, objValue, "setFreezeImmediately", moduleName,
361          JsSceneSession::SetFreezeImmediately);
362  }
363  
BindNativeMethodForKeyboard(napi_env env,napi_value objValue,const char * moduleName)364  void JsSceneSession::BindNativeMethodForKeyboard(napi_env env, napi_value objValue, const char* moduleName)
365  {
366      BindNativeFunction(env, objValue, "setSCBKeepKeyboard", moduleName, JsSceneSession::SetSCBKeepKeyboard);
367      BindNativeFunction(env, objValue, "requestHideKeyboard", moduleName, JsSceneSession::RequestHideKeyboard);
368      BindNativeFunction(env, objValue, "openKeyboardSyncTransaction", moduleName,
369          JsSceneSession::OpenKeyboardSyncTransaction);
370      BindNativeFunction(env, objValue, "closeKeyboardSyncTransaction", moduleName,
371          JsSceneSession::CloseKeyboardSyncTransaction);
372      BindNativeFunction(env, objValue, "notifyTargetScreenWidthAndHeight", moduleName,
373          JsSceneSession::NotifyTargetScreenWidthAndHeight);
374  }
375  
BindNativeMethodForCompatiblePcMode(napi_env env,napi_value objValue,const char * moduleName)376  void JsSceneSession::BindNativeMethodForCompatiblePcMode(napi_env env, napi_value objValue, const char* moduleName)
377  {
378      BindNativeFunction(env, objValue, "setCompatibleWindowSizeInPc", moduleName,
379          JsSceneSession::SetCompatibleWindowSizeInPc);
380      BindNativeFunction(env, objValue, "setAppSupportPhoneInPc", moduleName,
381          JsSceneSession::SetAppSupportPhoneInPc);
382  }
383  
BindNativeMethodForSCBSystemSession(napi_env env,napi_value objValue,const char * moduleName)384  void JsSceneSession::BindNativeMethodForSCBSystemSession(napi_env env, napi_value objValue, const char* moduleName)
385  {
386      BindNativeFunction(env, objValue, "syncScenePanelGlobalPosition", moduleName,
387          JsSceneSession::SyncScenePanelGlobalPosition);
388      BindNativeFunction(env, objValue, "unSyncScenePanelGlobalPosition", moduleName,
389          JsSceneSession::UnSyncScenePanelGlobalPosition);
390  }
391  
BindNativeMethodForFocus(napi_env env,napi_value objValue,const char * moduleName)392  void JsSceneSession::BindNativeMethodForFocus(napi_env env, napi_value objValue, const char* moduleName)
393  {
394      BindNativeFunction(env, objValue, "setFocusable", moduleName, JsSceneSession::SetFocusable);
395      BindNativeFunction(env, objValue, "setFocusableOnShow", moduleName, JsSceneSession::SetFocusableOnShow);
396      BindNativeFunction(env, objValue, "setSystemSceneBlockingFocus", moduleName,
397          JsSceneSession::SetSystemSceneBlockingFocus);
398  }
399  
JsSceneSession(napi_env env,const sptr<SceneSession> & session)400  JsSceneSession::JsSceneSession(napi_env env, const sptr<SceneSession>& session)
401      : env_(env), weakSession_(session), persistentId_(session->GetPersistentId()),
402        taskScheduler_(std::make_shared<MainThreadScheduler>(env))
403  {
404      InitListenerFuncs();
405      sptr<SceneSession::SessionChangeCallback> sessionchangeCallback = new (std::nothrow)
406          SceneSession::SessionChangeCallback();
407      if (sessionchangeCallback != nullptr) {
408          if (session != nullptr) {
409              session->RegisterSessionChangeCallback(sessionchangeCallback);
410              session->RegisterClearCallbackMapCallback([weakThis = wptr(this)](bool needRemove, int32_t persistentId) {
411                  auto jsSceneSession = weakThis.promote();
412                  if (!jsSceneSession) {
413                      TLOGNE(WmsLogTag::WMS_LIFE, "clearCallbackFunc jsSceneSession is null");
414                      return;
415                  }
416                  jsSceneSession->ClearCbMap(needRemove, persistentId);
417              });
418          }
419          sessionchangeCallback_ = sessionchangeCallback;
420          WLOGFD("RegisterSessionChangeCallback success");
421      }
422  }
423  
~JsSceneSession()424  JsSceneSession::~JsSceneSession()
425  {
426      TLOGI(WmsLogTag::WMS_LIFE, "destroyed, id:%{public}d", persistentId_);
427      auto session = weakSession_.promote();
428      if (session == nullptr) {
429          TLOGI(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
430          return;
431      }
432      session->UnregisterSessionChangeListeners();
433      SceneSessionManager::GetInstance().UnregisterCreateSubSessionListener(session->GetPersistentId());
434  }
435  
InitListenerFuncs()436  void JsSceneSession::InitListenerFuncs()
437  {
438  }
439  
ProcessPendingSceneSessionActivationRegister()440  void JsSceneSession::ProcessPendingSceneSessionActivationRegister()
441  {
442      auto session = weakSession_.promote();
443      if (session == nullptr) {
444          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
445          return;
446      }
447      const char* const where = __func__;
448      session->SetPendingSessionActivationEventListener([weakThis = wptr(this), where](SessionInfo& info) {
449          auto jsSceneSession = weakThis.promote();
450          if (!jsSceneSession) {
451              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
452              return;
453          }
454          jsSceneSession->PendingSessionActivation(info);
455      });
456      TLOGD(WmsLogTag::WMS_LIFE, "success");
457  }
458  
ProcessWindowDragHotAreaRegister()459  void JsSceneSession::ProcessWindowDragHotAreaRegister()
460  {
461      WLOGFI("[NAPI]ProcessWindowDragHotAreaRegister");
462      NotifyWindowDragHotAreaFunc func = [weakThis = wptr(this)](uint32_t type, const SizeChangeReason& reason) {
463          auto jsSceneSession = weakThis.promote();
464          if (!jsSceneSession) {
465              TLOGE(WmsLogTag::WMS_LIFE, "ProcessWindowDragHotAreaRegister jsSceneSession is null");
466              return;
467          }
468          jsSceneSession->OnWindowDragHotArea(type, reason);
469      };
470      auto session = weakSession_.promote();
471      if (session == nullptr) {
472          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
473          return;
474      }
475      session->SetWindowDragHotAreaListener(func);
476  }
477  
OnWindowDragHotArea(uint32_t type,const SizeChangeReason & reason)478  void JsSceneSession::OnWindowDragHotArea(uint32_t type, const SizeChangeReason& reason)
479  {
480      WLOGFI("[NAPI]OnWindowDragHotArea");
481  
482      auto session = weakSession_.promote();
483      if (session == nullptr) {
484          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
485          return;
486      }
487      WSRect rect = session->GetSessionTargetRect();
488      auto task = [weakThis = wptr(this), persistentId = persistentId_, env = env_, type, reason, rect] {
489          auto jsSceneSession = weakThis.promote();
490          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
491              TLOGE(WmsLogTag::WMS_LIFE, "OnWindowDragHotArea jsSceneSession id:%{public}d has been destroyed",
492                  persistentId);
493              return;
494          }
495          auto jsCallBack = jsSceneSession->GetJSCallback(WINDOW_DRAG_HOT_AREA_CB);
496          if (!jsCallBack) {
497              WLOGFE("[NAPI]jsCallBack is nullptr");
498              return;
499          }
500          napi_value jsHotAreaType = CreateJsValue(env, type);
501          if (jsHotAreaType == nullptr) {
502              WLOGFE("[NAPI]jsHotAreaType is nullptr");
503              return;
504          }
505          napi_value jsHotAreaReason = CreateJsValue(env, reason);
506          if (jsHotAreaReason == nullptr) {
507              WLOGFE("[NAPI]jsHotAreaReason is nullptr");
508              return;
509          }
510          napi_value jsHotAreaRect = CreateJsSessionRect(env, rect);
511          if (jsHotAreaRect == nullptr) {
512              WLOGFE("[NAPI]jsHotAreaRect is nullptr");
513              return;
514          }
515          napi_value argv[] = {jsHotAreaType, jsHotAreaReason, jsHotAreaRect};
516          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
517      };
518      taskScheduler_->PostMainThreadTask(task, "OnWindowDragHotArea");
519  }
520  
ProcessSessionInfoLockedStateChangeRegister()521  void JsSceneSession::ProcessSessionInfoLockedStateChangeRegister()
522  {
523      NotifySessionInfoLockedStateChangeFunc func = [weakThis = wptr(this)](bool lockedState) {
524          auto jsSceneSession = weakThis.promote();
525          if (!jsSceneSession) {
526              TLOGE(WmsLogTag::WMS_LIFE, "ProcessSessionInfoLockedStateChangeRegister jsSceneSession is null");
527              return;
528          }
529          jsSceneSession->OnSessionInfoLockedStateChange(lockedState);
530      };
531      auto session = weakSession_.promote();
532      if (session == nullptr) {
533          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
534          return;
535      }
536      session->SetSessionInfoLockedStateChangeListener(func);
537      WLOGFD("ProcessSessionInfoLockedStateChangeRegister success");
538  }
539  
ProcessLandscapeMultiWindowRegister()540  void JsSceneSession::ProcessLandscapeMultiWindowRegister()
541  {
542      TLOGD(WmsLogTag::WMS_MULTI_WINDOW, "ProcessLandscapeMultiWindowRegister");
543      auto sessionchangeCallback = sessionchangeCallback_.promote();
544      if (sessionchangeCallback == nullptr) {
545          TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "sessionchangeCallback is nullptr");
546          return;
547      }
548      sessionchangeCallback->onSetLandscapeMultiWindowFunc_ = [weakThis = wptr(this)](bool isLandscapeMultiWindow) {
549          auto jsSceneSession = weakThis.promote();
550          if (!jsSceneSession) {
551              TLOGE(WmsLogTag::WMS_LIFE, "ProcessLandscapeMultiWindowRegister jsSceneSession is null");
552              return;
553          }
554          jsSceneSession->SetLandscapeMultiWindow(isLandscapeMultiWindow);
555      };
556      TLOGD(WmsLogTag::WMS_MULTI_WINDOW, "ProcessLandscapeMultiWindowRegister success");
557  }
558  
SetLandscapeMultiWindow(bool isLandscapeMultiWindow)559  void JsSceneSession::SetLandscapeMultiWindow(bool isLandscapeMultiWindow)
560  {
561      TLOGI(WmsLogTag::WMS_MULTI_WINDOW, "[NAPI]SetLandScapeMultiWindow, isLandscapeMultiWindow: %{public}u",
562          isLandscapeMultiWindow);
563  
564      auto task = [weakThis = wptr(this), persistentId = persistentId_, isLandscapeMultiWindow, env = env_] {
565          auto jsSceneSession = weakThis.promote();
566          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
567              TLOGE(WmsLogTag::WMS_LIFE, "SetLandscapeMultiWindow jsSceneSession id:%{public}d has been destroyed",
568                  persistentId);
569              return;
570          }
571          auto jsCallBack = jsSceneSession->GetJSCallback(LANDSCAPE_MULTI_WINDOW_CB);
572          if (!jsCallBack) {
573              WLOGFE("[NAPI]jsCallBack is nullptr");
574              return;
575          }
576          napi_value jsSessionLandscapeMultiWindowObj = CreateJsValue(env, isLandscapeMultiWindow);
577          napi_value argv[] = {jsSessionLandscapeMultiWindowObj};
578          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
579      };
580      taskScheduler_->PostMainThreadTask(task,
581          "SetLandscapeMultiWindow, isLandscapeMultiWindow:" + std::to_string(isLandscapeMultiWindow));
582  }
583  
ProcessKeyboardGravityChangeRegister()584  void JsSceneSession::ProcessKeyboardGravityChangeRegister()
585  {
586      auto session = weakSession_.promote();
587      if (session == nullptr) {
588          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
589          return;
590      }
591      NotifyKeyboardGravityChangeFunc func = [weakThis = wptr(this)](SessionGravity gravity) {
592          auto jsSceneSession = weakThis.promote();
593          if (!jsSceneSession) {
594              TLOGE(WmsLogTag::WMS_LIFE, "ProcessKeyboardGravityChangeRegister jsSceneSession is null");
595              return;
596          }
597          jsSceneSession->OnKeyboardGravityChange(gravity);
598      };
599      session->SetKeyboardGravityChangeCallback(func);
600      TLOGI(WmsLogTag::WMS_KEYBOARD, "Register success");
601  }
602  
OnKeyboardGravityChange(SessionGravity gravity)603  void JsSceneSession::OnKeyboardGravityChange(SessionGravity gravity)
604  {
605      TLOGI(WmsLogTag::WMS_KEYBOARD, "[NAPI] gravity: %{public}u", gravity);
606      auto task = [weakThis = wptr(this), persistentId = persistentId_, gravity, env = env_] {
607          auto jsSceneSession = weakThis.promote();
608          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
609              TLOGE(WmsLogTag::WMS_LIFE, "OnKeyboardGravityChange jsSceneSession id:%{public}d has been destroyed",
610                  persistentId);
611              return;
612          }
613          auto jsCallBack = jsSceneSession->GetJSCallback(KEYBOARD_GRAVITY_CHANGE_CB);
614          if (!jsCallBack) {
615              WLOGFE("[NAPI]jsCallBack is nullptr");
616              return;
617          }
618          napi_value gravityObj = CreateJsValue(env, gravity);
619          napi_value argv[] = {gravityObj};
620          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
621          TLOGI(WmsLogTag::WMS_KEYBOARD, "Napi call gravity success, gravity: %{public}u", gravity);
622      };
623      taskScheduler_->PostMainThreadTask(task, "OnKeyboardGravityChange: gravity " +
624          std::to_string(static_cast<int>(gravity)));
625  }
626  
ProcessAdjustKeyboardLayoutRegister()627  void JsSceneSession::ProcessAdjustKeyboardLayoutRegister()
628  {
629      NotifyKeyboardLayoutAdjustFunc func = [weakThis = wptr(this)](const KeyboardLayoutParams& params) {
630          auto jsSceneSession = weakThis.promote();
631          if (!jsSceneSession) {
632              TLOGE(WmsLogTag::WMS_LIFE, "ProcessAdjustKeyboardLayoutRegister jsSceneSession is null");
633              return;
634          }
635          jsSceneSession->OnAdjustKeyboardLayout(params);
636      };
637      auto session = weakSession_.promote();
638      if (session == nullptr) {
639          TLOGE(WmsLogTag::WMS_KEYBOARD, "session is nullptr");
640          return;
641      }
642      session->SetAdjustKeyboardLayoutCallback(func);
643      TLOGI(WmsLogTag::WMS_KEYBOARD, "Register success");
644  }
645  
ProcessLayoutFullScreenChangeRegister()646  void JsSceneSession::ProcessLayoutFullScreenChangeRegister()
647  {
648      auto sessionchangeCallback = sessionchangeCallback_.promote();
649      if (sessionchangeCallback == nullptr) {
650          TLOGE(WmsLogTag::WMS_LAYOUT, "sessionchangeCallback is nullptr");
651          return;
652      }
653      sessionchangeCallback->onLayoutFullScreenChangeFunc_ = [weakThis = wptr(this)](bool isLayoutFullScreen) {
654          auto jsSceneSession = weakThis.promote();
655          if (!jsSceneSession) {
656              TLOGE(WmsLogTag::WMS_LIFE, "ProcessLayoutFullScreenChangeRegister jsSceneSession is null");
657              return;
658          }
659          jsSceneSession->OnLayoutFullScreenChange(isLayoutFullScreen);
660      };
661      TLOGI(WmsLogTag::WMS_LAYOUT, "Register success");
662  }
663  
OnLayoutFullScreenChange(bool isLayoutFullScreen)664  void JsSceneSession::OnLayoutFullScreenChange(bool isLayoutFullScreen)
665  {
666      auto task = [weakThis = wptr(this), persistentId = persistentId_, isLayoutFullScreen, env = env_] {
667          auto jsSceneSession = weakThis.promote();
668          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
669              TLOGE(WmsLogTag::WMS_LIFE, "OnLayoutFullScreenChange jsSceneSession id:%{public}d has been destroyed",
670                  persistentId);
671              return;
672          }
673          auto jsCallBack = jsSceneSession->GetJSCallback(LAYOUT_FULL_SCREEN_CB);
674          if (!jsCallBack) {
675              TLOGE(WmsLogTag::WMS_LAYOUT, "OnLayoutFullScreenChange jsCallBack is nullptr");
676              return;
677          }
678          napi_value paramsObj = CreateJsValue(env, isLayoutFullScreen);
679          napi_value argv[] = {paramsObj};
680          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
681      };
682      taskScheduler_->PostMainThreadTask(task, "OnLayoutFullScreenChange");
683  }
684  
ProcessTitleAndDockHoverShowChangeRegister()685  void JsSceneSession::ProcessTitleAndDockHoverShowChangeRegister()
686  {
687      auto session = weakSession_.promote();
688      if (session == nullptr) {
689          TLOGE(WmsLogTag::WMS_IMMS, "session is nullptr, id:%{public}d", persistentId_);
690          return;
691      }
692      const char* const funcName = __func__;
693      session->SetTitleAndDockHoverShowChangeCallback([weakThis = wptr(this), funcName](
694          bool isTitleHoverShown, bool isDockHoverShown) {
695          auto jsSceneSession = weakThis.promote();
696          if (!jsSceneSession) {
697              TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s jsSceneSession is null", funcName);
698              return;
699          }
700          jsSceneSession->OnTitleAndDockHoverShowChange(isTitleHoverShown, isDockHoverShown);
701      });
702      TLOGI(WmsLogTag::WMS_IMMS, "Register success, persistent id %{public}d", persistentId_);
703  }
704  
OnTitleAndDockHoverShowChange(bool isTitleHoverShown,bool isDockHoverShown)705  void JsSceneSession::OnTitleAndDockHoverShowChange(bool isTitleHoverShown, bool isDockHoverShown)
706  {
707      const char* const funcName = __func__;
708      auto task = [weakThis = wptr(this), persistentId = persistentId_, isTitleHoverShown, isDockHoverShown,
709          env = env_, funcName] {
710          auto jsSceneSession = weakThis.promote();
711          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
712              TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s jsSceneSession id:%{public}d has been destroyed",
713                  funcName, persistentId);
714              return;
715          }
716          auto jsCallBack = jsSceneSession->GetJSCallback(TITLE_DOCK_HOVER_SHOW_CB);
717          if (!jsCallBack) {
718              TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s jsCallBack is nullptr", funcName);
719              return;
720          }
721          napi_value jsObjTitle = CreateJsValue(env, isTitleHoverShown);
722          napi_value jsObjDock = CreateJsValue(env, isDockHoverShown);
723          napi_value argv[] = {jsObjTitle, jsObjDock};
724          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
725      };
726      taskScheduler_->PostMainThreadTask(task, funcName);
727  }
728  
ProcessDefaultDensityEnabledRegister()729  void JsSceneSession::ProcessDefaultDensityEnabledRegister()
730  {
731      auto session = weakSession_.promote();
732      if (session == nullptr) {
733          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
734          return;
735      }
736      session->RegisterDefaultDensityEnabledCallback([weakThis = wptr(this)](bool isDefaultDensityEnabled) {
737          auto jsSceneSession = weakThis.promote();
738          if (!jsSceneSession) {
739              TLOGNE(WmsLogTag::WMS_LIFE, "ProcessDefaultDensityEnabledRegister jsSceneSession is null");
740              return;
741          }
742          jsSceneSession->OnDefaultDensityEnabled(isDefaultDensityEnabled);
743      });
744      TLOGI(WmsLogTag::WMS_LAYOUT, "success");
745  }
746  
OnDefaultDensityEnabled(bool isDefaultDensityEnabled)747  void JsSceneSession::OnDefaultDensityEnabled(bool isDefaultDensityEnabled)
748  {
749      auto task = [weakThis = wptr(this), persistentId = persistentId_, isDefaultDensityEnabled, env = env_] {
750          auto jsSceneSession = weakThis.promote();
751          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
752              TLOGNE(WmsLogTag::WMS_LIFE, "OnDefaultDensityEnabled jsSceneSession id:%{public}d has been destroyed",
753                  persistentId);
754              return;
755          }
756          auto jsCallBack = jsSceneSession->GetJSCallback(DEFAULT_DENSITY_ENABLED_CB);
757          if (!jsCallBack) {
758              TLOGNE(WmsLogTag::WMS_LAYOUT, "OnDefaultDensityEnabled jsCallBack is nullptr");
759              return;
760          }
761          napi_value paramsObj = CreateJsValue(env, isDefaultDensityEnabled);
762          napi_value argv[] = {paramsObj};
763          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
764      };
765      taskScheduler_->PostMainThreadTask(task, "OnDefaultDensityEnabled");
766  }
767  
ProcessRestoreMainWindowRegister()768  void JsSceneSession::ProcessRestoreMainWindowRegister()
769  {
770      auto session = weakSession_.promote();
771      if (session == nullptr) {
772          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
773          return;
774      }
775      const char* const funcName = __func__;
776      session->SetRestoreMainWindowCallback([weakThis = wptr(this), funcName] {
777          auto jsSceneSession = weakThis.promote();
778          if (!jsSceneSession) {
779              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", funcName);
780              return;
781          }
782          jsSceneSession->RestoreMainWindow();
783      });
784      TLOGI(WmsLogTag::WMS_LIFE, "success");
785  }
786  
RestoreMainWindow()787  void JsSceneSession::RestoreMainWindow()
788  {
789      const char* const funcName = __func__;
790      auto task = [weakThis = wptr(this), persistentId = persistentId_, env = env_, funcName] {
791          auto jsSceneSession = weakThis.promote();
792          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
793              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession id:%{public}d has been destroyed",
794                  funcName, persistentId);
795              return;
796          }
797          auto jsCallBack = jsSceneSession->GetJSCallback(RESTORE_MAIN_WINDOW_CB);
798          if (!jsCallBack) {
799              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsCallBack is nullptr", funcName);
800              return;
801          }
802          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), 0, {}, nullptr);
803      };
804      taskScheduler_->PostMainThreadTask(task, funcName);
805  }
806  
OnAdjustKeyboardLayout(const KeyboardLayoutParams & params)807  void JsSceneSession::OnAdjustKeyboardLayout(const KeyboardLayoutParams& params)
808  {
809      auto task = [weakThis = wptr(this), persistentId = persistentId_, params, env = env_] {
810          auto jsSceneSession = weakThis.promote();
811          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
812              TLOGE(WmsLogTag::WMS_LIFE, "OnAdjustKeyboardLayout jsSceneSession id:%{public}d has been destroyed",
813                  persistentId);
814              return;
815          }
816          auto jsCallBack = jsSceneSession->GetJSCallback(ADJUST_KEYBOARD_LAYOUT_CB);
817          if (!jsCallBack) {
818              TLOGE(WmsLogTag::WMS_KEYBOARD, "OnAdjustKeyboardLayout jsCallBack is nullptr");
819              return;
820          }
821          napi_value keyboardLayoutParamsObj = CreateJsKeyboardLayoutParams(env, params);
822          if (keyboardLayoutParamsObj == nullptr) {
823              TLOGE(WmsLogTag::WMS_KEYBOARD, "OnAdjustKeyboardLayout this keyboard layout params obj is nullptr");
824          }
825          napi_value argv[] = {keyboardLayoutParamsObj};
826          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
827      };
828      taskScheduler_->PostMainThreadTask(task, "OnAdjustKeyboardLayout");
829  }
830  
OnSessionInfoLockedStateChange(bool lockedState)831  void JsSceneSession::OnSessionInfoLockedStateChange(bool lockedState)
832  {
833      WLOGFI("[NAPI]OnSessionInfoLockedStateChange, state: %{public}u", lockedState);
834  
835      auto task = [weakThis = wptr(this), persistentId = persistentId_, lockedState, env = env_] {
836          auto jsSceneSession = weakThis.promote();
837          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
838              TLOGE(WmsLogTag::WMS_LIFE, "OnSessionInfoLockedStateChange jsSceneSession id:%{public}d has been destroyed",
839                  persistentId);
840              return;
841          }
842          auto jsCallBack = jsSceneSession->GetJSCallback(SESSIONINFO_LOCKEDSTATE_CHANGE_CB);
843          if (!jsCallBack) {
844              WLOGFE("[NAPI]jsCallBack is nullptr");
845              return;
846          }
847          napi_value jsSessionInfoLockedStateObj = CreateJsValue(env, lockedState);
848          napi_value argv[] = {jsSessionInfoLockedStateObj};
849          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
850      };
851      taskScheduler_->PostMainThreadTask(task, "OnSessionInfoLockedStateChange: state " + std::to_string(lockedState));
852  }
853  
ClearCbMap(bool needRemove,int32_t persistentId)854  void JsSceneSession::ClearCbMap(bool needRemove, int32_t persistentId)
855  {
856      if (!needRemove) {
857          return;
858      }
859      auto task = [weakThis = wptr(this), persistentId]() {
860          TLOGI(WmsLogTag::WMS_LIFE, "clear callbackMap with persistent id, %{public}d", persistentId);
861          auto jsSceneSession = weakThis.promote();
862          if (!jsSceneSession) {
863              TLOGE(WmsLogTag::WMS_LIFE, "ClearCbMap jsSceneSession is null");
864              return;
865          }
866          {
867              HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsSceneSession clear jsCbMap");
868              std::unique_lock<std::shared_mutex> lock(jsSceneSession->jsCbMapMutex_);
869              jsSceneSession->jsCbMap_.clear();
870          }
871          auto iter = jsSceneSessionMap_.find(persistentId);
872          if (iter != jsSceneSessionMap_.end()) {
873              napi_delete_reference(jsSceneSession->env_, iter->second);
874              jsSceneSessionMap_.erase(iter);
875          } else {
876              TLOGE(WmsLogTag::WMS_LIFE, "deleteRef failed , %{public}d", persistentId);
877          }
878      };
879      taskScheduler_->PostMainThreadTask(task, "ClearCbMap PID:" + std::to_string(persistentId));
880  }
881  
ProcessSessionDefaultAnimationFlagChangeRegister()882  void JsSceneSession::ProcessSessionDefaultAnimationFlagChangeRegister()
883  {
884      auto session = weakSession_.promote();
885      if (session == nullptr) {
886          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
887          return;
888      }
889      session->RegisterDefaultAnimationFlagChangeCallback([weakThis = wptr(this)](bool isNeedDefaultAnimationFlag) {
890          auto jsSceneSession = weakThis.promote();
891          if (!jsSceneSession) {
892              TLOGE(WmsLogTag::WMS_LIFE, "ProcessSessionDefaultAnimationFlagChangeRegister jsSceneSession is null");
893              return;
894          }
895          jsSceneSession->OnDefaultAnimationFlagChange(isNeedDefaultAnimationFlag);
896      });
897  }
898  
OnDefaultAnimationFlagChange(bool isNeedDefaultAnimationFlag)899  void JsSceneSession::OnDefaultAnimationFlagChange(bool isNeedDefaultAnimationFlag)
900  {
901      WLOGFI("[NAPI]OnDefaultAnimationFlagChange, flag: %{public}u", isNeedDefaultAnimationFlag);
902  
903      auto task = [weakThis = wptr(this), persistentId = persistentId_, isNeedDefaultAnimationFlag, env = env_] {
904          auto jsSceneSession = weakThis.promote();
905          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
906              TLOGE(WmsLogTag::WMS_LIFE, "OnDefaultAnimationFlagChange jsSceneSession id:%{public}d has been destroyed",
907                  persistentId);
908              return;
909          }
910          auto jsCallBack = jsSceneSession->GetJSCallback(NEED_DEFAULT_ANIMATION_FLAG_CHANGE_CB);
911          if (!jsCallBack) {
912              WLOGFE("[NAPI]jsCallBack is nullptr");
913              return;
914          }
915          napi_value jsSessionDefaultAnimationFlagObj = CreateJsValue(env, isNeedDefaultAnimationFlag);
916          napi_value argv[] = {jsSessionDefaultAnimationFlagObj};
917          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
918      };
919      std::string info = "OnDefaultAnimationFlagChange, flag:" + std::to_string(isNeedDefaultAnimationFlag);
920      taskScheduler_->PostMainThreadTask(task, info);
921  }
922  
ProcessChangeSessionVisibilityWithStatusBarRegister()923  void JsSceneSession::ProcessChangeSessionVisibilityWithStatusBarRegister()
924  {
925      NotifyChangeSessionVisibilityWithStatusBarFunc func = [weakThis = wptr(this)](SessionInfo& info, bool visible) {
926          auto jsSceneSession = weakThis.promote();
927          if (!jsSceneSession) {
928              TLOGE(WmsLogTag::WMS_LIFE, "ProcessChangeSessionVisibilityWithStatusBarRegister jsSceneSession is null");
929              return;
930          }
931          jsSceneSession->ChangeSessionVisibilityWithStatusBar(info, visible);
932      };
933      auto session = weakSession_.promote();
934      if (session == nullptr) {
935          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
936          return;
937      }
938      session->SetChangeSessionVisibilityWithStatusBarEventListener(func);
939      WLOGFD("ProcessChangeSessionVisibilityWithStatusBarRegister success");
940  }
941  
ProcessSessionStateChangeRegister()942  void JsSceneSession::ProcessSessionStateChangeRegister()
943  {
944      NotifySessionStateChangeFunc func = [weakThis = wptr(this)](const SessionState& state) {
945          auto jsSceneSession = weakThis.promote();
946          if (!jsSceneSession) {
947              TLOGE(WmsLogTag::WMS_LIFE, "ProcessSessionStateChangeRegister jsSceneSession is null");
948              return;
949          }
950          jsSceneSession->OnSessionStateChange(state);
951      };
952      auto session = weakSession_.promote();
953      if (session == nullptr) {
954          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
955          return;
956      }
957      session->SetSessionStateChangeListenser(func);
958      WLOGFD("ProcessSessionStateChangeRegister success");
959  }
960  
ProcessBufferAvailableChangeRegister()961  void JsSceneSession::ProcessBufferAvailableChangeRegister()
962  {
963      NotifyBufferAvailableChangeFunc func = [weakThis = wptr(this)](const bool isAvailable) {
964          auto jsSceneSession = weakThis.promote();
965          if (!jsSceneSession) {
966              TLOGE(WmsLogTag::WMS_LIFE, "ProcessBufferAvailableChangeRegister jsSceneSession is null");
967              return;
968          }
969          jsSceneSession->OnBufferAvailableChange(isAvailable);
970      };
971      auto session = weakSession_.promote();
972      if (session == nullptr) {
973          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
974          return;
975      }
976      session->SetBufferAvailableChangeListener(func);
977      WLOGFD("ProcessBufferAvailableChangeRegister success");
978  }
979  
ProcessCreateSubSessionRegister()980  void JsSceneSession::ProcessCreateSubSessionRegister()
981  {
982      NotifyCreateSubSessionFunc func = [weakThis = wptr(this)](const sptr<SceneSession>& sceneSession) {
983          auto jsSceneSession = weakThis.promote();
984          if (!jsSceneSession) {
985              TLOGE(WmsLogTag::WMS_LIFE, "ProcessCreateSubSessionRegister jsSceneSession is null");
986              return;
987          }
988          jsSceneSession->OnCreateSubSession(sceneSession);
989      };
990      auto session = weakSession_.promote();
991      if (session == nullptr) {
992          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
993          return;
994      }
995      SceneSessionManager::GetInstance().RegisterCreateSubSessionListener(session->GetPersistentId(), func);
996      WLOGFD("ProcessCreateSubSessionRegister success, id: %{public}d", session->GetPersistentId());
997  }
998  
ProcessBindDialogTargetRegister()999  void JsSceneSession::ProcessBindDialogTargetRegister()
1000  {
1001      auto sessionchangeCallback = sessionchangeCallback_.promote();
1002      if (sessionchangeCallback == nullptr) {
1003          TLOGE(WmsLogTag::WMS_DIALOG, "sessionchangeCallback is nullptr");
1004          return;
1005      }
1006      sessionchangeCallback->onBindDialogTarget_ = [weakThis = wptr(this)](const sptr<SceneSession>& sceneSession) {
1007          auto jsSceneSession = weakThis.promote();
1008          if (!jsSceneSession) {
1009              TLOGE(WmsLogTag::WMS_LIFE, "ProcessBindDialogTargetRegister jsSceneSession is null");
1010              return;
1011          }
1012          jsSceneSession->OnBindDialogTarget(sceneSession);
1013      };
1014      TLOGD(WmsLogTag::WMS_DIALOG, "ProcessBindDialogTargetRegister success");
1015  }
1016  
ProcessSessionRectChangeRegister()1017  void JsSceneSession::ProcessSessionRectChangeRegister()
1018  {
1019      NotifySessionRectChangeFunc func = [weakThis = wptr(this)](const WSRect& rect, const SizeChangeReason& reason) {
1020          auto jsSceneSession = weakThis.promote();
1021          if (!jsSceneSession) {
1022              TLOGE(WmsLogTag::WMS_LIFE, "ProcessSessionRectChangeRegister jsSceneSession is null");
1023              return;
1024          }
1025          jsSceneSession->OnSessionRectChange(rect, reason);
1026      };
1027      auto session = weakSession_.promote();
1028      if (session == nullptr) {
1029          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
1030          return;
1031      }
1032      session->SetSessionRectChangeCallback(func);
1033      WLOGFD("ProcessSessionRectChangeRegister success");
1034  }
1035  
ProcessSessionPiPControlStatusChangeRegister()1036  void JsSceneSession::ProcessSessionPiPControlStatusChangeRegister()
1037  {
1038      NotifySessionPiPControlStatusChangeFunc func = [weakThis = wptr(this)](
1039          WsPiPControlType controlType, WsPiPControlStatus status) {
1040          auto jsSceneSession = weakThis.promote();
1041          if (!jsSceneSession) {
1042              TLOGE(WmsLogTag::WMS_LIFE, "ProcessSessionPiPControlStatusChangeRegister jsSceneSession is null");
1043              return;
1044          }
1045          jsSceneSession->OnSessionPiPControlStatusChange(controlType, status);
1046      };
1047      auto session = weakSession_.promote();
1048      if (session == nullptr) {
1049          TLOGE(WmsLogTag::WMS_PIP, "session is nullptr, id:%{public}d", persistentId_);
1050          return;
1051      }
1052      session->SetSessionPiPControlStatusChangeCallback(func);
1053      TLOGI(WmsLogTag::WMS_PIP, "register success");
1054  }
1055  
ProcessAutoStartPiPStatusChangeRegister()1056  void JsSceneSession::ProcessAutoStartPiPStatusChangeRegister()
1057  {
1058      auto session = weakSession_.promote();
1059      if (session == nullptr) {
1060          TLOGE(WmsLogTag::WMS_PIP, "session is nullptr, id:%{public}d", persistentId_);
1061          return;
1062      }
1063      NotifyAutoStartPiPStatusChangeFunc func = [weakThis = wptr(this)](bool isAutoStart, uint32_t priority) {
1064          auto jsSceneSession = weakThis.promote();
1065          if (!jsSceneSession) {
1066              TLOGNE(WmsLogTag::WMS_PIP, "jsSceneSession is null");
1067              return;
1068          }
1069          jsSceneSession->OnAutoStartPiPStatusChange(isAutoStart, priority);
1070      };
1071      session->SetAutoStartPiPStatusChangeCallback(func);
1072      TLOGI(WmsLogTag::WMS_PIP, "success");
1073  }
1074  
1075  /** @note @window.hierarchy */
ProcessRaiseToTopRegister()1076  void JsSceneSession::ProcessRaiseToTopRegister()
1077  {
1078      auto sessionchangeCallback = sessionchangeCallback_.promote();
1079      if (sessionchangeCallback == nullptr) {
1080          WLOGFE("sessionchangeCallback is nullptr");
1081          return;
1082      }
1083      sessionchangeCallback->onRaiseToTop_ = [weakThis = wptr(this)] {
1084          auto jsSceneSession = weakThis.promote();
1085          if (!jsSceneSession) {
1086              TLOGE(WmsLogTag::WMS_LIFE, "ProcessRaiseToTopRegister jsSceneSession is null");
1087              return;
1088          }
1089          jsSceneSession->OnRaiseToTop();
1090      };
1091      WLOGFD("ProcessRaiseToTopRegister success");
1092  }
1093  
1094  /** @note @window.hierarchy */
ProcessRaiseToTopForPointDownRegister()1095  void JsSceneSession::ProcessRaiseToTopForPointDownRegister()
1096  {
1097      NotifyRaiseToTopForPointDownFunc func = [weakThis = wptr(this)]() {
1098          auto jsSceneSession = weakThis.promote();
1099          if (!jsSceneSession) {
1100              TLOGE(WmsLogTag::WMS_LIFE, "ProcessRaiseToTopForPointDownRegister jsSceneSession is null");
1101              return;
1102          }
1103          jsSceneSession->OnRaiseToTopForPointDown();
1104      };
1105      auto session = weakSession_.promote();
1106      if (session == nullptr) {
1107          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
1108          return;
1109      }
1110      session->SetRaiseToAppTopForPointDownFunc(func);
1111      WLOGFD("ProcessRaiseToTopForPointDownRegister success");
1112  }
1113  
1114  /** @note @window.hierarchy */
ProcessRaiseAboveTargetRegister()1115  void JsSceneSession::ProcessRaiseAboveTargetRegister()
1116  {
1117      auto sessionchangeCallback = sessionchangeCallback_.promote();
1118      if (sessionchangeCallback == nullptr) {
1119          WLOGFE("sessionchangeCallback is nullptr");
1120          return;
1121      }
1122      sessionchangeCallback->onRaiseAboveTarget_ = [weakThis = wptr(this)](int32_t subWindowId) {
1123          auto jsSceneSession = weakThis.promote();
1124          if (!jsSceneSession) {
1125              TLOGE(WmsLogTag::WMS_LIFE, "ProcessRaiseAboveTargetRegister jsSceneSession is null");
1126              return;
1127          }
1128          jsSceneSession->OnRaiseAboveTarget(subWindowId);
1129      };
1130      WLOGFD("ProcessRaiseToTopRegister success");
1131  }
1132  
ProcessSessionEventRegister()1133  void JsSceneSession::ProcessSessionEventRegister()
1134  {
1135      auto sessionchangeCallback = sessionchangeCallback_.promote();
1136      if (sessionchangeCallback == nullptr) {
1137          WLOGFE("sessionchangeCallback is nullptr");
1138          return;
1139      }
1140      sessionchangeCallback->OnSessionEvent_ = [weakThis = wptr(this)](uint32_t eventId, const SessionEventParam& param) {
1141          auto jsSceneSession = weakThis.promote();
1142          if (!jsSceneSession) {
1143              TLOGE(WmsLogTag::WMS_LIFE, "ProcessSessionEventRegister jsSceneSession is null");
1144              return;
1145          }
1146          jsSceneSession->OnSessionEvent(eventId, param);
1147      };
1148      WLOGFD("ProcessSessionEventRegister success");
1149  }
1150  
ProcessTerminateSessionRegister()1151  void JsSceneSession::ProcessTerminateSessionRegister()
1152  {
1153      TLOGD(WmsLogTag::WMS_LIFE, "begin");
1154      auto session = weakSession_.promote();
1155      if (session == nullptr) {
1156          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
1157          return;
1158      }
1159      const char* const where = __func__;
1160      session->SetTerminateSessionListener([weakThis = wptr(this), where](const SessionInfo& info) {
1161          auto jsSceneSession = weakThis.promote();
1162          if (!jsSceneSession) {
1163              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
1164              return;
1165          }
1166          jsSceneSession->TerminateSession(info);
1167      });
1168      TLOGD(WmsLogTag::WMS_LIFE, "success");
1169  }
1170  
ProcessTerminateSessionRegisterNew()1171  void JsSceneSession::ProcessTerminateSessionRegisterNew()
1172  {
1173      TLOGD(WmsLogTag::WMS_LIFE, "begin");
1174      auto session = weakSession_.promote();
1175      if (session == nullptr) {
1176          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
1177          return;
1178      }
1179      const char* const where = __func__;
1180      session->SetTerminateSessionListenerNew([weakThis = wptr(this), where](
1181          const SessionInfo& info, bool needStartCaller, bool isFromBroker) {
1182          auto jsSceneSession = weakThis.promote();
1183          if (!jsSceneSession) {
1184              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
1185              return;
1186          }
1187          jsSceneSession->TerminateSessionNew(info, needStartCaller, isFromBroker);
1188      });
1189      TLOGD(WmsLogTag::WMS_LIFE, "success");
1190  }
1191  
ProcessTerminateSessionRegisterTotal()1192  void JsSceneSession::ProcessTerminateSessionRegisterTotal()
1193  {
1194      TLOGD(WmsLogTag::WMS_LIFE, "begin");
1195      auto session = weakSession_.promote();
1196      if (session == nullptr) {
1197          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
1198          return;
1199      }
1200      const char* const where = __func__;
1201      session->SetTerminateSessionListenerTotal([weakThis = wptr(this), where](
1202          const SessionInfo& info, TerminateType terminateType) {
1203          auto jsSceneSession = weakThis.promote();
1204          if (!jsSceneSession) {
1205              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
1206              return;
1207          }
1208          jsSceneSession->TerminateSessionTotal(info, terminateType);
1209      });
1210      TLOGD(WmsLogTag::WMS_LIFE, "success");
1211  }
1212  
ProcessPendingSessionToForegroundRegister()1213  void JsSceneSession::ProcessPendingSessionToForegroundRegister()
1214  {
1215      TLOGD(WmsLogTag::WMS_LIFE, "begin");
1216      auto session = weakSession_.promote();
1217      if (session == nullptr) {
1218          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
1219          return;
1220      }
1221      const char* const where = __func__;
1222      session->SetPendingSessionToForegroundListener([weakThis = wptr(this), where](const SessionInfo& info) {
1223          auto jsSceneSession = weakThis.promote();
1224          if (!jsSceneSession) {
1225              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
1226              return;
1227          }
1228          jsSceneSession->PendingSessionToForeground(info);
1229      });
1230      TLOGD(WmsLogTag::WMS_LIFE, "success");
1231  }
1232  
ProcessPendingSessionToBackgroundForDelegatorRegister()1233  void JsSceneSession::ProcessPendingSessionToBackgroundForDelegatorRegister()
1234  {
1235      TLOGD(WmsLogTag::WMS_LIFE, "in");
1236      auto session = weakSession_.promote();
1237      if (session == nullptr) {
1238          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
1239          return;
1240      }
1241      const char* const where = __func__;
1242      session->SetPendingSessionToBackgroundForDelegatorListener([weakThis = wptr(this), where](
1243          const SessionInfo& info, bool shouldBackToCaller) {
1244          auto jsSceneSession = weakThis.promote();
1245          if (!jsSceneSession) {
1246              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
1247              return;
1248          }
1249          jsSceneSession->PendingSessionToBackgroundForDelegator(info, shouldBackToCaller);
1250      });
1251      TLOGD(WmsLogTag::WMS_LIFE, "success");
1252  }
1253  
ProcessSessionExceptionRegister()1254  void JsSceneSession::ProcessSessionExceptionRegister()
1255  {
1256      TLOGD(WmsLogTag::WMS_LIFE, "in");
1257      auto session = weakSession_.promote();
1258      if (session == nullptr) {
1259          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
1260          return;
1261      }
1262      const char* const where = __func__;
1263      session->SetSessionExceptionListener([weakThis = wptr(this), where](const SessionInfo& info,
1264          bool needRemoveSession, bool startFail) {
1265          auto jsSceneSession = weakThis.promote();
1266          if (!jsSceneSession) {
1267              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
1268              return;
1269          }
1270          jsSceneSession->OnSessionException(info, needRemoveSession, startFail);
1271      }, true);
1272  }
1273  
1274  /** @note @window.hierarchy */
ProcessSessionTopmostChangeRegister()1275  void JsSceneSession::ProcessSessionTopmostChangeRegister()
1276  {
1277      auto sessionchangeCallback = sessionchangeCallback_.promote();
1278      if (sessionchangeCallback == nullptr) {
1279          TLOGE(WmsLogTag::WMS_LAYOUT, "sessionchangeCallback is nullptr");
1280          return;
1281      }
1282      sessionchangeCallback->onSessionTopmostChange_ = [weakThis = wptr(this)](bool topmost) {
1283          auto jsSceneSession = weakThis.promote();
1284          if (!jsSceneSession) {
1285              TLOGE(WmsLogTag::WMS_LIFE, "ProcessSessionTopmostChangeRegister jsSceneSession is null");
1286              return;
1287          }
1288          jsSceneSession->OnSessionTopmostChange(topmost);
1289      };
1290      auto session = weakSession_.promote();
1291      if (session == nullptr) {
1292          TLOGE(WmsLogTag::WMS_LAYOUT, "session is nullptr, id:%{public}d", persistentId_);
1293          return;
1294      }
1295      sessionchangeCallback->onSessionTopmostChange_(session->IsTopmost());
1296      TLOGD(WmsLogTag::WMS_LAYOUT, "ProcessSessionTopmostChangeRegister success");
1297  }
1298  
1299  /** @note @window.hierarchy */
ProcessMainWindowTopmostChangeRegister()1300  void JsSceneSession::ProcessMainWindowTopmostChangeRegister()
1301  {
1302      auto session = weakSession_.promote();
1303      if (session == nullptr) {
1304          TLOGE(WmsLogTag::WMS_HIERARCHY, "session is nullptr, id:%{public}d", persistentId_);
1305          return;
1306      }
1307      const char* const where = __func__;
1308      session->SetMainWindowTopmostChangeCallback([weakThis = wptr(this), where](bool isTopmost) {
1309          auto jsSceneSession = weakThis.promote();
1310          if (!jsSceneSession) {
1311              TLOGNE(WmsLogTag::WMS_HIERARCHY, "%{public}s jsSceneSession is null", where);
1312              return;
1313          }
1314          jsSceneSession->OnMainWindowTopmostChange(isTopmost);
1315      });
1316      TLOGD(WmsLogTag::WMS_HIERARCHY, "register success");
1317  }
1318  
ProcessSubModalTypeChangeRegister()1319  void JsSceneSession::ProcessSubModalTypeChangeRegister()
1320  {
1321      auto session = weakSession_.promote();
1322      if (session == nullptr) {
1323          TLOGE(WmsLogTag::WMS_HIERARCHY, "session is nullptr, persistentId:%{public}d", persistentId_);
1324          return;
1325      }
1326      const char* const where = __func__;
1327      session->RegisterSubModalTypeChangeCallback([weakThis = wptr(this), where](SubWindowModalType subWindowModalType) {
1328          auto jsSceneSession = weakThis.promote();
1329          if (!jsSceneSession) {
1330              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
1331              return;
1332          }
1333          jsSceneSession->OnSubModalTypeChange(subWindowModalType);
1334      });
1335      TLOGD(WmsLogTag::WMS_HIERARCHY, "register success, persistentId:%{public}d", persistentId_);
1336  }
1337  
ProcessMainModalTypeChangeRegister()1338  void JsSceneSession::ProcessMainModalTypeChangeRegister()
1339  {
1340      auto session = weakSession_.promote();
1341      if (session == nullptr) {
1342          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, persistentId:%{public}d", persistentId_);
1343          return;
1344      }
1345      const char* const where = __func__;
1346      session->RegisterMainModalTypeChangeCallback([weakThis = wptr(this), where](bool isModal) {
1347          auto jsSceneSession = weakThis.promote();
1348          if (!jsSceneSession) {
1349              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
1350              return;
1351          }
1352          jsSceneSession->OnMainModalTypeChange(isModal);
1353      });
1354      TLOGD(WmsLogTag::WMS_HIERARCHY, "register success, persistentId:%{public}d", persistentId_);
1355  }
1356  
ProcessSessionFocusableChangeRegister()1357  void JsSceneSession::ProcessSessionFocusableChangeRegister()
1358  {
1359      NotifySessionFocusableChangeFunc func = [weakThis = wptr(this)](bool isFocusable) {
1360          auto jsSceneSession = weakThis.promote();
1361          if (!jsSceneSession) {
1362              TLOGE(WmsLogTag::WMS_LIFE, "ProcessSessionFocusableChangeRegister jsSceneSession is null");
1363              return;
1364          }
1365          jsSceneSession->OnSessionFocusableChange(isFocusable);
1366      };
1367      auto session = weakSession_.promote();
1368      if (session == nullptr) {
1369          WLOGFE("[WMSComm]session is nullptr, id:%{public}d", persistentId_);
1370          return;
1371      }
1372      session->SetSessionFocusableChangeListener(func);
1373      TLOGD(WmsLogTag::WMS_FOCUS, "ProcessSessionFocusableChangeRegister success");
1374  }
1375  
ProcessSessionTouchableChangeRegister()1376  void JsSceneSession::ProcessSessionTouchableChangeRegister()
1377  {
1378      NotifySessionTouchableChangeFunc func = [weakThis = wptr(this)](bool touchable) {
1379          auto jsSceneSession = weakThis.promote();
1380          if (!jsSceneSession) {
1381              TLOGE(WmsLogTag::WMS_LIFE, "ProcessSessionTouchableChangeRegister jsSceneSession is null");
1382              return;
1383          }
1384          jsSceneSession->OnSessionTouchableChange(touchable);
1385      };
1386      auto session = weakSession_.promote();
1387      if (session == nullptr) {
1388          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
1389          return;
1390      }
1391      session->SetSessionTouchableChangeListener(func);
1392      WLOGFD("ProcessSessionTouchableChangeRegister success");
1393  }
1394  
ProcessClickRegister()1395  void JsSceneSession::ProcessClickRegister()
1396  {
1397      NotifyClickFunc func = [weakThis = wptr(this)]() {
1398          auto jsSceneSession = weakThis.promote();
1399          if (!jsSceneSession) {
1400              TLOGE(WmsLogTag::WMS_LIFE, "ProcessClickRegister jsSceneSession is null");
1401              return;
1402          }
1403          jsSceneSession->OnClick();
1404      };
1405      auto session = weakSession_.promote();
1406      if (session == nullptr) {
1407          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
1408          return;
1409      }
1410      session->SetClickListener(func);
1411      WLOGFD("ProcessClickChangeRegister success");
1412  }
1413  
ProcessContextTransparentRegister()1414  void JsSceneSession::ProcessContextTransparentRegister()
1415  {
1416      NotifyContextTransparentFunc func = [weakThis = wptr(this)]() {
1417          auto jsSceneSession = weakThis.promote();
1418          if (!jsSceneSession) {
1419              TLOGE(WmsLogTag::WMS_LIFE, "ProcessContextTransparentRegister jsSceneSession is null");
1420              return;
1421          }
1422          jsSceneSession->OnContextTransparent();
1423      };
1424      auto session = weakSession_.promote();
1425      if (session == nullptr) {
1426          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
1427          return;
1428      }
1429      session->SetContextTransparentFunc(func);
1430      WLOGFD("ProcessContextTransparentRegister success");
1431  }
1432  
OnSessionEvent(uint32_t eventId,const SessionEventParam & param)1433  void JsSceneSession::OnSessionEvent(uint32_t eventId, const SessionEventParam& param)
1434  {
1435      WLOGFI("[NAPI]OnSessionEvent, eventId: %{public}d", eventId);
1436  
1437      auto task = [weakThis = wptr(this), persistentId = persistentId_, eventId, param, env = env_] {
1438          auto jsSceneSession = weakThis.promote();
1439          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
1440              TLOGE(WmsLogTag::WMS_LIFE, "OnSessionEvent jsSceneSession id:%{public}d has been destroyed",
1441                  persistentId);
1442              return;
1443          }
1444          auto jsCallBack = jsSceneSession->GetJSCallback(SESSION_EVENT_CB);
1445          if (jsCallBack == nullptr) {
1446              WLOGFE("[NAPI]jsCallBack is nullptr");
1447              return;
1448          }
1449          napi_value jsSessionStateObj = CreateJsValue(env, eventId);
1450          napi_value jsSessionParamObj = CreateJsSessionEventParam(env, param);
1451          napi_value argv[] = {jsSessionStateObj, jsSessionParamObj};
1452          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
1453      };
1454      std::unique_ptr<NapiAsyncTask::ExecuteCallback> execute = nullptr;
1455      taskScheduler_->PostMainThreadTask(task, "OnSessionEvent, EventId:" + std::to_string(eventId));
1456  }
1457  
ProcessBackPressedRegister()1458  void JsSceneSession::ProcessBackPressedRegister()
1459  {
1460      auto session = weakSession_.promote();
1461      if (session == nullptr) {
1462          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
1463          return;
1464      }
1465      const char* const where = __func__;
1466      session->SetBackPressedListenser([weakThis = wptr(this), where](bool needMoveToBackground) {
1467          auto jsSceneSession = weakThis.promote();
1468          if (!jsSceneSession) {
1469              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
1470              return;
1471          }
1472          jsSceneSession->OnBackPressed(needMoveToBackground);
1473      });
1474  }
1475  
ProcessSystemBarPropertyChangeRegister()1476  void JsSceneSession::ProcessSystemBarPropertyChangeRegister()
1477  {
1478      auto session = weakSession_.promote();
1479      if (session == nullptr) {
1480          TLOGE(WmsLogTag::WMS_IMMS, "session is null, id:%{public}d", persistentId_);
1481          return;
1482      }
1483      session->RegisterSystemBarPropertyChangeCallback([weakThis = wptr(this)](
1484          const std::unordered_map<WindowType, SystemBarProperty>& propertyMap) {
1485          auto jsSceneSession = weakThis.promote();
1486          if (!jsSceneSession) {
1487              TLOGNE(WmsLogTag::WMS_LIFE, "jsSceneSession is null");
1488              return;
1489          }
1490          jsSceneSession->OnSystemBarPropertyChange(propertyMap);
1491      });
1492  }
1493  
ProcessNeedAvoidRegister()1494  void JsSceneSession::ProcessNeedAvoidRegister()
1495  {
1496      auto session = weakSession_.promote();
1497      if (session == nullptr) {
1498          TLOGE(WmsLogTag::WMS_IMMS, "session is null, id: %{public}d", persistentId_);
1499          return;
1500      }
1501      session->RegisterNeedAvoidCallback([weakThis = wptr(this)](bool status) {
1502          auto jsSceneSession = weakThis.promote();
1503          if (!jsSceneSession) {
1504              TLOGNE(WmsLogTag::WMS_IMMS, "jsSceneSession is null");
1505              return;
1506          }
1507          jsSceneSession->OnNeedAvoid(status);
1508      });
1509  }
1510  
ProcessIsCustomAnimationPlaying()1511  void JsSceneSession::ProcessIsCustomAnimationPlaying()
1512  {
1513      auto session = weakSession_.promote();
1514      if (session == nullptr) {
1515          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr");
1516          return;
1517      }
1518      session->RegisterIsCustomAnimationPlayingCallback([weakThis = wptr(this)](bool status) {
1519          auto jsSceneSession = weakThis.promote();
1520          if (!jsSceneSession) {
1521              TLOGNE(WmsLogTag::WMS_LIFE, "jsSceneSession is null");
1522              return;
1523          }
1524          jsSceneSession->OnIsCustomAnimationPlaying(status);
1525      });
1526  }
1527  
ProcessShowWhenLockedRegister()1528  void JsSceneSession::ProcessShowWhenLockedRegister()
1529  {
1530      auto session = weakSession_.promote();
1531      if (session == nullptr) {
1532          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
1533          return;
1534      }
1535      const char* const where = __func__;
1536      session->RegisterShowWhenLockedCallback([weakThis = wptr(this), where](bool showWhenLocked) {
1537          auto jsSceneSession = weakThis.promote();
1538          if (!jsSceneSession) {
1539              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
1540              return;
1541          }
1542          jsSceneSession->OnShowWhenLocked(showWhenLocked);
1543      });
1544      TLOGD(WmsLogTag::WMS_LIFE, "success");
1545  }
1546  
ProcessRequestedOrientationChange()1547  void JsSceneSession::ProcessRequestedOrientationChange()
1548  {
1549      auto session = weakSession_.promote();
1550      if (session == nullptr) {
1551          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr");
1552          return;
1553      }
1554      session->RegisterRequestedOrientationChangeCallback([weakThis = wptr(this)](uint32_t orientation) {
1555          auto jsSceneSession = weakThis.promote();
1556          if (!jsSceneSession) {
1557              TLOGNE(WmsLogTag::WMS_LIFE, "jsSceneSession is null");
1558              return;
1559          }
1560          jsSceneSession->OnReuqestedOrientationChange(orientation);
1561      });
1562  }
1563  
ProcessForceHideChangeRegister()1564  void JsSceneSession::ProcessForceHideChangeRegister()
1565  {
1566      auto session = weakSession_.promote();
1567      if (session == nullptr) {
1568          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
1569          return;
1570      }
1571      const char* const where = __func__;
1572      session->RegisterForceHideChangeCallback([weakThis = wptr(this), where](bool hide) {
1573          auto jsSceneSession = weakThis.promote();
1574          if (!jsSceneSession) {
1575              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession is null", where);
1576              return;
1577          }
1578          jsSceneSession->OnForceHideChange(hide);
1579      });
1580      TLOGD(WmsLogTag::WMS_LIFE, "success");
1581  }
1582  
OnForceHideChange(bool hide)1583  void JsSceneSession::OnForceHideChange(bool hide)
1584  {
1585      WLOGFI("[NAPI]OnForceHideChange, hide: %{public}u", hide);
1586  
1587      auto task = [weakThis = wptr(this), persistentId = persistentId_, hide, env = env_] {
1588          auto jsSceneSession = weakThis.promote();
1589          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
1590              TLOGE(WmsLogTag::WMS_LIFE, "OnForceHideChange jsSceneSession id:%{public}d has been destroyed",
1591                  persistentId);
1592              return;
1593          }
1594          auto jsCallBack = jsSceneSession->GetJSCallback(FORCE_HIDE_CHANGE_CB);
1595          if (!jsCallBack) {
1596              WLOGFE("[NAPI]jsCallBack is nullptr");
1597              return;
1598          }
1599          napi_value jsSessionForceHideObj = CreateJsValue(env, hide);
1600          napi_value argv[] = {jsSessionForceHideObj};
1601          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
1602      };
1603      taskScheduler_->PostMainThreadTask(task, "OnForceHideChange, hide:" + std::to_string(hide));
1604  }
1605  
ProcessTouchOutsideRegister()1606  void JsSceneSession::ProcessTouchOutsideRegister()
1607  {
1608      auto session = weakSession_.promote();
1609      if (session == nullptr) {
1610          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr");
1611          return;
1612      }
1613      session->RegisterTouchOutsideCallback([weakThis = wptr(this)] {
1614          auto jsSceneSession = weakThis.promote();
1615          if (!jsSceneSession) {
1616              TLOGNE(WmsLogTag::WMS_LIFE, "jsSceneSession is null");
1617              return;
1618          }
1619          jsSceneSession->OnTouchOutside();
1620      });
1621  }
1622  
OnTouchOutside()1623  void JsSceneSession::OnTouchOutside()
1624  {
1625      WLOGFI("[NAPI]OnTouchOutside");
1626      auto task = [weakThis = wptr(this), persistentId = persistentId_, env = env_] {
1627          auto jsSceneSession = weakThis.promote();
1628          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
1629              TLOGE(WmsLogTag::WMS_LIFE, "OnTouchOutside jsSceneSession id:%{public}d has been destroyed",
1630                  persistentId);
1631              return;
1632          }
1633          auto jsCallBack = jsSceneSession->GetJSCallback(TOUCH_OUTSIDE_CB);
1634          if (!jsCallBack) {
1635              WLOGFE("[NAPI]jsCallBack is nullptr");
1636              return;
1637          }
1638          napi_value argv[] = {};
1639          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), 0, argv, nullptr);
1640      };
1641      taskScheduler_->PostMainThreadTask(task);
1642  }
1643  
ProcessFrameLayoutFinishRegister()1644  void JsSceneSession::ProcessFrameLayoutFinishRegister()
1645  {
1646      NotifyFrameLayoutFinishFunc func = [weakThis = wptr(this)]() {
1647          auto jsSceneSession = weakThis.promote();
1648          if (!jsSceneSession) {
1649              TLOGE(WmsLogTag::WMS_LIFE, "ProcessFrameLayoutFinishRegister jsSceneSession is null");
1650              return;
1651          }
1652          jsSceneSession->NotifyFrameLayoutFinish();
1653      };
1654      auto session = weakSession_.promote();
1655      if (session == nullptr) {
1656          TLOGI(WmsLogTag::WMS_MULTI_WINDOW, "session is nullptr");
1657          return;
1658      }
1659      session->SetFrameLayoutFinishListener(func);
1660      TLOGD(WmsLogTag::WMS_MULTI_WINDOW, "success");
1661  }
1662  
NotifyFrameLayoutFinish()1663  void JsSceneSession::NotifyFrameLayoutFinish()
1664  {
1665      TLOGI(WmsLogTag::WMS_MULTI_WINDOW, "[NAPI]NotifyFrameLayoutFinish");
1666      auto session = weakSession_.promote();
1667      if (session == nullptr) {
1668          TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "session is nullptr");
1669          return;
1670      }
1671      auto task = [weakThis = wptr(this), persistentId = persistentId_, env = env_] {
1672          auto jsSceneSession = weakThis.promote();
1673          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
1674              TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "jsSceneSession id:%{public}d has been destroyed", persistentId);
1675              return;
1676          }
1677          auto jsCallBack = jsSceneSession->GetJSCallback(NEXT_FRAME_LAYOUT_FINISH_CB);
1678          if (!jsCallBack) {
1679              TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "[NAPI]jsCallBack is nullptr");
1680              return;
1681          }
1682          napi_value argv[] = {};
1683          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), 0, argv, nullptr);
1684      };
1685      taskScheduler_->PostMainThreadTask(task, "NotifyFrameLayoutFinish");
1686  }
1687  
Finalizer(napi_env env,void * data,void * hint)1688  void JsSceneSession::Finalizer(napi_env env, void* data, void* hint)
1689  {
1690      WLOGI("[NAPI]Finalizer");
1691      auto jsSceneSession = static_cast<JsSceneSession*>(data);
1692      if (jsSceneSession == nullptr) {
1693          TLOGE(WmsLogTag::WMS_LIFE, "JsSceneSession is nullptr");
1694          return;
1695      }
1696      jsSceneSession->DecStrongRef(nullptr);
1697  }
1698  
RegisterCallback(napi_env env,napi_callback_info info)1699  napi_value JsSceneSession::RegisterCallback(napi_env env, napi_callback_info info)
1700  {
1701      WLOGD("[NAPI]RegisterCallback");
1702      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1703      return (me != nullptr) ? me->OnRegisterCallback(env, info) : nullptr;
1704  }
1705  
UpdateNativeVisibility(napi_env env,napi_callback_info info)1706  napi_value JsSceneSession::UpdateNativeVisibility(napi_env env, napi_callback_info info)
1707  {
1708      if (Session::IsScbCoreEnabled()) {
1709          return nullptr;
1710      }
1711      WLOGI("[NAPI]UpdateNativeVisibility");
1712      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1713      return (me != nullptr) ? me->OnUpdateNativeVisibility(env, info) : nullptr;
1714  }
1715  
SetPrivacyMode(napi_env env,napi_callback_info info)1716  napi_value JsSceneSession::SetPrivacyMode(napi_env env, napi_callback_info info)
1717  {
1718      WLOGI("[NAPI]SetPrivacyMode");
1719      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1720      return (me != nullptr) ? me->OnSetPrivacyMode(env, info) : nullptr;
1721  }
1722  
SetSkipSelfWhenShowOnVirtualScreen(napi_env env,napi_callback_info info)1723  napi_value JsSceneSession::SetSkipSelfWhenShowOnVirtualScreen(napi_env env, napi_callback_info info)
1724  {
1725      WLOGI("[NAPI]SetSkipSelfWhenShowOnVirtualScreen");
1726      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1727      return (me != nullptr) ? me->OnSetSkipSelfWhenShowOnVirtualScreen(env, info) : nullptr;
1728  }
1729  
SetSystemSceneOcclusionAlpha(napi_env env,napi_callback_info info)1730  napi_value JsSceneSession::SetSystemSceneOcclusionAlpha(napi_env env, napi_callback_info info)
1731  {
1732      WLOGI("[NAPI]SetSystemSceneOcclusionAlpha");
1733      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1734      return (me != nullptr) ? me->OnSetSystemSceneOcclusionAlpha(env, info) : nullptr;
1735  }
1736  
SetSystemSceneForceUIFirst(napi_env env,napi_callback_info info)1737  napi_value JsSceneSession::SetSystemSceneForceUIFirst(napi_env env, napi_callback_info info)
1738  {
1739      TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
1740      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1741      return (me != nullptr) ? me->OnSetSystemSceneForceUIFirst(env, info) : nullptr;
1742  }
1743  
MarkSystemSceneUIFirst(napi_env env,napi_callback_info info)1744  napi_value JsSceneSession::MarkSystemSceneUIFirst(napi_env env, napi_callback_info info)
1745  {
1746      TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
1747      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1748      return (me != nullptr) ? me->OnMarkSystemSceneUIFirst(env, info) : nullptr;
1749  }
1750  
SetFocusable(napi_env env,napi_callback_info info)1751  napi_value JsSceneSession::SetFocusable(napi_env env, napi_callback_info info)
1752  {
1753      TLOGD(WmsLogTag::WMS_FOCUS, "[NAPI]SetFocusable");
1754      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1755      return (me != nullptr) ? me->OnSetFocusable(env, info) : nullptr;
1756  }
1757  
SetFocusableOnShow(napi_env env,napi_callback_info info)1758  napi_value JsSceneSession::SetFocusableOnShow(napi_env env, napi_callback_info info)
1759  {
1760      TLOGD(WmsLogTag::WMS_FOCUS, "[NAPI]");
1761      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1762      return (me != nullptr) ? me->OnSetFocusableOnShow(env, info) : nullptr;
1763  }
1764  
SetSystemSceneBlockingFocus(napi_env env,napi_callback_info info)1765  napi_value JsSceneSession::SetSystemSceneBlockingFocus(napi_env env, napi_callback_info info)
1766  {
1767      TLOGD(WmsLogTag::WMS_FOCUS, "[NAPI]SetSystemSceneBlockingFocus");
1768      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1769      return (me != nullptr) ? me->OnSetSystemSceneBlockingFocus(env, info) : nullptr;
1770  }
1771  
UpdateSizeChangeReason(napi_env env,napi_callback_info info)1772  napi_value JsSceneSession::UpdateSizeChangeReason(napi_env env, napi_callback_info info)
1773  {
1774      WLOGD("[NAPI]UpdateSizeChangeReason");
1775      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1776      return (me != nullptr) ? me->OnUpdateSizeChangeReason(env, info) : nullptr;
1777  }
1778  
OpenKeyboardSyncTransaction(napi_env env,napi_callback_info info)1779  napi_value JsSceneSession::OpenKeyboardSyncTransaction(napi_env env, napi_callback_info info)
1780  {
1781      TLOGD(WmsLogTag::WMS_KEYBOARD, "[NAPI]OpenKeyboardSyncTransaction");
1782      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1783      return (me != nullptr) ? me->OnOpenKeyboardSyncTransaction(env, info) : nullptr;
1784  }
1785  
CloseKeyboardSyncTransaction(napi_env env,napi_callback_info info)1786  napi_value JsSceneSession::CloseKeyboardSyncTransaction(napi_env env, napi_callback_info info)
1787  {
1788      TLOGD(WmsLogTag::WMS_KEYBOARD, "[NAPI]CloseKeyboardSyncTransaction");
1789      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1790      return (me != nullptr) ? me->OnCloseKeyboardSyncTransaction(env, info) : nullptr;
1791  }
1792  
NotifyTargetScreenWidthAndHeight(napi_env env,napi_callback_info info)1793  napi_value JsSceneSession::NotifyTargetScreenWidthAndHeight(napi_env env, napi_callback_info info)
1794  {
1795      TLOGD(WmsLogTag::WMS_KEYBOARD, "[NAPI]NotifyTargetScreenWidthAndHeight");
1796      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1797      return (me != nullptr) ? me->OnNotifyTargetScreenWidthAndHeight(env, info) : nullptr;
1798  }
1799  
SetShowRecent(napi_env env,napi_callback_info info)1800  napi_value JsSceneSession::SetShowRecent(napi_env env, napi_callback_info info)
1801  {
1802      WLOGI("[NAPI]SetShowRecent");
1803      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1804      return (me != nullptr) ? me->OnSetShowRecent(env, info) : nullptr;
1805  }
1806  
1807  /** @note @window.hierarchy */
SetZOrder(napi_env env,napi_callback_info info)1808  napi_value JsSceneSession::SetZOrder(napi_env env, napi_callback_info info)
1809  {
1810      if (Session::IsScbCoreEnabled()) {
1811          return nullptr;
1812      }
1813      WLOGD("[NAPI]SetZOrder");
1814      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1815      return (me != nullptr) ? me->OnSetZOrder(env, info) : nullptr;
1816  }
1817  
SetTouchable(napi_env env,napi_callback_info info)1818  napi_value JsSceneSession::SetTouchable(napi_env env, napi_callback_info info)
1819  {
1820      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1821      return (me != nullptr) ? me->OnSetTouchable(env, info): nullptr;
1822  }
1823  
SetSystemActive(napi_env env,napi_callback_info info)1824  napi_value JsSceneSession::SetSystemActive(napi_env env, napi_callback_info info)
1825  {
1826      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1827      return (me != nullptr) ? me->OnSetSystemActive(env, info): nullptr;
1828  }
1829  
SetFloatingScale(napi_env env,napi_callback_info info)1830  napi_value JsSceneSession::SetFloatingScale(napi_env env, napi_callback_info info)
1831  {
1832      WLOGI("[NAPI]SetFloatingScale");
1833      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1834      return (me != nullptr) ? me->OnSetFloatingScale(env, info) : nullptr;
1835  }
1836  
SetIsMidScene(napi_env env,napi_callback_info info)1837  napi_value JsSceneSession::SetIsMidScene(napi_env env, napi_callback_info info)
1838  {
1839      TLOGD(WmsLogTag::WMS_MULTI_WINDOW, "[NAPI]");
1840      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1841      return (me != nullptr) ? me->OnSetIsMidScene(env, info) : nullptr;
1842  }
1843  
SetSCBKeepKeyboard(napi_env env,napi_callback_info info)1844  napi_value JsSceneSession::SetSCBKeepKeyboard(napi_env env, napi_callback_info info)
1845  {
1846      WLOGI("[NAPI]SetSCBKeepKeyboard");
1847      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1848      return (me != nullptr) ? me->OnSetSCBKeepKeyboard(env, info) : nullptr;
1849  }
1850  
SetOffset(napi_env env,napi_callback_info info)1851  napi_value JsSceneSession::SetOffset(napi_env env, napi_callback_info info)
1852  {
1853      if (Session::IsScbCoreEnabled()) {
1854          return nullptr;
1855      }
1856      WLOGI("[NAPI]SetOffset");
1857      JsSceneSession *me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1858      return (me != nullptr) ? me->OnSetOffset(env, info) : nullptr;
1859  }
1860  
SetExitSplitOnBackground(napi_env env,napi_callback_info info)1861  napi_value JsSceneSession::SetExitSplitOnBackground(napi_env env, napi_callback_info info)
1862  {
1863      TLOGD(WmsLogTag::WMS_MULTI_WINDOW, "[NAPI] In");
1864      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1865      return (me != nullptr) ? me->OnSetExitSplitOnBackground(env, info) : nullptr;
1866  }
1867  
SetWaterMarkFlag(napi_env env,napi_callback_info info)1868  napi_value JsSceneSession::SetWaterMarkFlag(napi_env env, napi_callback_info info)
1869  {
1870      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1871      return (me != nullptr) ? me->OnSetWaterMarkFlag(env, info) : nullptr;
1872  }
1873  
SetPipActionEvent(napi_env env,napi_callback_info info)1874  napi_value JsSceneSession::SetPipActionEvent(napi_env env, napi_callback_info info)
1875  {
1876      TLOGI(WmsLogTag::WMS_PIP, "[NAPI]SetPipActionEvent");
1877      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1878      return (me != nullptr) ? me->OnSetPipActionEvent(env, info) : nullptr;
1879  }
1880  
SetPiPControlEvent(napi_env env,napi_callback_info info)1881  napi_value JsSceneSession::SetPiPControlEvent(napi_env env, napi_callback_info info)
1882  {
1883      TLOGI(WmsLogTag::WMS_PIP, "[NAPI]");
1884      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1885      return (me != nullptr) ? me->OnSetPiPControlEvent(env, info) : nullptr;
1886  }
1887  
NotifyPipOcclusionChange(napi_env env,napi_callback_info info)1888  napi_value JsSceneSession::NotifyPipOcclusionChange(napi_env env, napi_callback_info info)
1889  {
1890      TLOGD(WmsLogTag::WMS_PIP, "[NAPI]");
1891      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1892      return (me != nullptr) ? me->OnNotifyPipOcclusionChange(env, info) : nullptr;
1893  }
1894  
NotifyDisplayStatusBarTemporarily(napi_env env,napi_callback_info info)1895  napi_value JsSceneSession::NotifyDisplayStatusBarTemporarily(napi_env env, napi_callback_info info)
1896  {
1897      JsSceneSession *me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1898      return (me != nullptr) ? me->OnNotifyDisplayStatusBarTemporarily(env, info) : nullptr;
1899  }
1900  
SetTemporarilyShowWhenLocked(napi_env env,napi_callback_info info)1901  napi_value JsSceneSession::SetTemporarilyShowWhenLocked(napi_env env, napi_callback_info info)
1902  {
1903      TLOGI(WmsLogTag::WMS_SCB, "[NAPI]SetTemporarilyShowWhenLocked");
1904      JsSceneSession *me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1905      return (me != nullptr) ? me->OnSetTemporarilyShowWhenLocked(env, info) : nullptr;
1906  }
1907  
SetSkipDraw(napi_env env,napi_callback_info info)1908  napi_value JsSceneSession::SetSkipDraw(napi_env env, napi_callback_info info)
1909  {
1910      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]SetSkipDraw");
1911      JsSceneSession *me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1912      return (me != nullptr) ? me->OnSetSkipDraw(env, info) : nullptr;
1913  }
1914  
SetCompatibleModeInPc(napi_env env,napi_callback_info info)1915  napi_value JsSceneSession::SetCompatibleModeInPc(napi_env env, napi_callback_info info)
1916  {
1917      TLOGI(WmsLogTag::WMS_SCB, "[NAPI]SetCompatibleModeInPc");
1918      JsSceneSession *me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1919      return (me != nullptr) ? me->OnSetCompatibleModeInPc(env, info) : nullptr;
1920  }
1921  
SetCompatibleWindowSizeInPc(napi_env env,napi_callback_info info)1922  napi_value JsSceneSession::SetCompatibleWindowSizeInPc(napi_env env, napi_callback_info info)
1923  {
1924      TLOGD(WmsLogTag::WMS_SCB, "[NAPI] called");
1925      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1926      return (me != nullptr) ? me->OnSetCompatibleWindowSizeInPc(env, info) : nullptr;
1927  }
1928  
SetAppSupportPhoneInPc(napi_env env,napi_callback_info info)1929  napi_value JsSceneSession::SetAppSupportPhoneInPc(napi_env env, napi_callback_info info)
1930  {
1931      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]");
1932      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1933      return (me != nullptr) ? me->OnSetAppSupportPhoneInPc(env, info) : nullptr;
1934  }
1935  
SetUniqueDensityDpiFromSCB(napi_env env,napi_callback_info info)1936  napi_value JsSceneSession::SetUniqueDensityDpiFromSCB(napi_env env, napi_callback_info info)
1937  {
1938      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]");
1939      JsSceneSession *me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1940      return (me != nullptr) ? me->OnSetUniqueDensityDpiFromSCB(env, info) : nullptr;
1941  }
1942  
SetBlankFlag(napi_env env,napi_callback_info info)1943  napi_value JsSceneSession::SetBlankFlag(napi_env env, napi_callback_info info)
1944  {
1945      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]SetBlankFlag");
1946      JsSceneSession *me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1947      return (me != nullptr) ? me->OnSetBlankFlag(env, info) : nullptr;
1948  }
1949  
RemoveBlank(napi_env env,napi_callback_info info)1950  napi_value JsSceneSession::RemoveBlank(napi_env env, napi_callback_info info)
1951  {
1952      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]");
1953      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1954      return (me != nullptr) ? me->OnRemoveBlank(env, info) : nullptr;
1955  }
1956  
SetBufferAvailableCallbackEnable(napi_env env,napi_callback_info info)1957  napi_value JsSceneSession::SetBufferAvailableCallbackEnable(napi_env env, napi_callback_info info)
1958  {
1959      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]SetBufferAvailableCallbackEnable");
1960      JsSceneSession *me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1961      return (me != nullptr) ? me->OnSetBufferAvailableCallbackEnable(env, info) : nullptr;
1962  }
1963  
SyncDefaultRequestedOrientation(napi_env env,napi_callback_info info)1964  napi_value JsSceneSession::SyncDefaultRequestedOrientation(napi_env env, napi_callback_info info)
1965  {
1966      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]");
1967      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1968      return (me != nullptr) ? me->OnSyncDefaultRequestedOrientation(env, info) : nullptr;
1969  }
1970  
SetIsPcAppInPad(napi_env env,napi_callback_info info)1971  napi_value JsSceneSession::SetIsPcAppInPad(napi_env env, napi_callback_info info)
1972  {
1973      TLOGI(WmsLogTag::WMS_SCB, "[NAPI]called");
1974      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1975      return (me != nullptr) ? me->OnSetIsPcAppInPad(env, info) : nullptr;
1976  }
1977  
SetCompatibleModeEnableInPad(napi_env env,napi_callback_info info)1978  napi_value JsSceneSession::SetCompatibleModeEnableInPad(napi_env env, napi_callback_info info)
1979  {
1980      TLOGI(WmsLogTag::WMS_SCB, "[NAPI]");
1981      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1982      return (me != nullptr) ? me->OnSetCompatibleModeEnableInPad(env, info) : nullptr;
1983  }
1984  
IsDeviceWakeupByApplication(napi_env env,napi_callback_info info)1985  napi_value JsSceneSession::IsDeviceWakeupByApplication(napi_env env, napi_callback_info info)
1986  {
1987      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]called");
1988      JsSceneSession *me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1989      return (me != nullptr) ? me->OnIsDeviceWakeupByApplication(env, info) : nullptr;
1990  }
1991  
SetStartingWindowExitAnimationFlag(napi_env env,napi_callback_info info)1992  napi_value JsSceneSession::SetStartingWindowExitAnimationFlag(napi_env env, napi_callback_info info)
1993  {
1994      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]called");
1995      JsSceneSession *me = CheckParamsAndGetThis<JsSceneSession>(env, info);
1996      return (me != nullptr) ? me->OnSetStartingWindowExitAnimationFlag(env, info) : nullptr;
1997  }
1998  
SyncScenePanelGlobalPosition(napi_env env,napi_callback_info info)1999  napi_value JsSceneSession::SyncScenePanelGlobalPosition(napi_env env, napi_callback_info info)
2000  {
2001      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]in");
2002      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
2003      return (me != nullptr) ? me->OnSyncScenePanelGlobalPosition(env, info) : nullptr;
2004  }
2005  
UnSyncScenePanelGlobalPosition(napi_env env,napi_callback_info info)2006  napi_value JsSceneSession::UnSyncScenePanelGlobalPosition(napi_env env, napi_callback_info info)
2007  {
2008      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]in");
2009      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
2010      return (me != nullptr) ? me->OnUnSyncScenePanelGlobalPosition(env, info) : nullptr;
2011  }
2012  
SetNeedSyncSessionRect(napi_env env,napi_callback_info info)2013  napi_value JsSceneSession::SetNeedSyncSessionRect(napi_env env, napi_callback_info info)
2014  {
2015      TLOGD(WmsLogTag::WMS_PIPELINE, "[NAPI]");
2016      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
2017      return (me != nullptr) ? me->OnSetNeedSyncSessionRect(env, info) : nullptr;
2018  }
2019  
SetWindowEnableDragBySystem(napi_env env,napi_callback_info info)2020  napi_value JsSceneSession::SetWindowEnableDragBySystem(napi_env env, napi_callback_info info)
2021  {
2022      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]");
2023      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
2024      return (me != nullptr) ? me->OnSetWindowEnableDragBySystem(env, info) : nullptr;
2025  }
2026  
SetIsActivatedAfterScreenLocked(napi_env env,napi_callback_info info)2027  napi_value JsSceneSession::SetIsActivatedAfterScreenLocked(napi_env env, napi_callback_info info)
2028  {
2029      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]");
2030      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
2031      return (me != nullptr) ? me->OnSetIsActivatedAfterScreenLocked(env, info) : nullptr;
2032  }
2033  
SetFrameGravity(napi_env env,napi_callback_info info)2034  napi_value JsSceneSession::SetFrameGravity(napi_env env, napi_callback_info info)
2035  {
2036      TLOGD(WmsLogTag::WMS_LAYOUT, "[NAPI]");
2037      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
2038      return (me != nullptr) ? me->OnSetFrameGravity(env, info) : nullptr;
2039  }
2040  
SetUseStartingWindowAboveLocked(napi_env env,napi_callback_info info)2041  napi_value JsSceneSession::SetUseStartingWindowAboveLocked(napi_env env, napi_callback_info info)
2042  {
2043      TLOGD(WmsLogTag::WMS_SCB, "[NAPI]");
2044      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
2045      return (me != nullptr) ? me->OnSetUseStartingWindowAboveLocked(env, info) : nullptr;
2046  }
2047  
SetFreezeImmediately(napi_env env,napi_callback_info info)2048  napi_value JsSceneSession::SetFreezeImmediately(napi_env env, napi_callback_info info)
2049  {
2050      TLOGD(WmsLogTag::DEFAULT, "in");
2051      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
2052      return (me != nullptr) ? me->OnSetFreezeImmediately(env, info) : nullptr;
2053  }
2054  
IsCallbackRegistered(napi_env env,const std::string & type,napi_value jsListenerObject)2055  bool JsSceneSession::IsCallbackRegistered(napi_env env, const std::string& type, napi_value jsListenerObject)
2056  {
2057      HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsSceneSession::IsCallbackRegistered[%s]", type.c_str());
2058      std::shared_lock<std::shared_mutex> lock(jsCbMapMutex_);
2059      if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
2060          return false;
2061      }
2062  
2063      for (auto iter = jsCbMap_.begin(); iter != jsCbMap_.end(); ++iter) {
2064          bool isEquals = false;
2065          napi_strict_equals(env, jsListenerObject, iter->second->GetNapiValue(), &isEquals);
2066          if (isEquals) {
2067              WLOGFE("[NAPI]Method %{public}s has already been registered", type.c_str());
2068              return true;
2069          }
2070      }
2071      return false;
2072  }
2073  
OnRegisterCallback(napi_env env,napi_callback_info info)2074  napi_value JsSceneSession::OnRegisterCallback(napi_env env, napi_callback_info info)
2075  {
2076      size_t argc = 4;
2077      napi_value argv[4] = {nullptr};
2078      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2079      if (argc < 2) { // 2: params num
2080          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
2081          return NapiGetUndefined(env);
2082      }
2083      std::string cbType;
2084      if (!ConvertFromJsValue(env, argv[0], cbType)) {
2085          WLOGFE("[NAPI]Failed to convert parameter to callbackType");
2086          return NapiGetUndefined(env);
2087      }
2088      napi_value value = argv[1];
2089      if (value == nullptr || !NapiIsCallable(env, value)) {
2090          WLOGFE("[NAPI]Invalid argument");
2091          return NapiGetUndefined(env);
2092      }
2093      auto iterFunctionType = ListenerFuncMap.find(cbType);
2094      if (iterFunctionType == ListenerFuncMap.end()) {
2095          WLOGFE("[NAPI]callback type is not supported, type = %{public}s", cbType.c_str());
2096          return NapiGetUndefined(env);
2097      }
2098      ListenerFuncType listenerFuncType = iterFunctionType->second;
2099      if (IsCallbackRegistered(env, cbType, value)) {
2100          WLOGFE("[NAPI]callback is registered, type = %{public}s", cbType.c_str());
2101          return NapiGetUndefined(env);
2102      }
2103      auto session = weakSession_.promote();
2104      if (session == nullptr) {
2105          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
2106          return NapiGetUndefined(env);
2107      }
2108  
2109      std::shared_ptr<NativeReference> callbackRef;
2110      napi_ref result = nullptr;
2111      napi_create_reference(env, value, 1, &result);
2112      callbackRef.reset(reinterpret_cast<NativeReference*>(result));
2113      {
2114          HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsSceneSession set jsCbMap[%s]", cbType.c_str());
2115          std::unique_lock<std::shared_mutex> lock(jsCbMapMutex_);
2116          jsCbMap_[cbType] = callbackRef;
2117      }
2118      ProcessRegisterCallback(listenerFuncType);
2119      WLOGFD("[NAPI]Register end, type = %{public}s", cbType.c_str());
2120      return NapiGetUndefined(env);
2121  }
2122  
ProcessRegisterCallback(ListenerFuncType listenerFuncType)2123  void JsSceneSession::ProcessRegisterCallback(ListenerFuncType listenerFuncType)
2124  {
2125      switch (static_cast<uint32_t>(listenerFuncType)) {
2126          case static_cast<uint32_t>(ListenerFuncType::PENDING_SCENE_CB):
2127              ProcessPendingSceneSessionActivationRegister();
2128              break;
2129          case static_cast<uint32_t>(ListenerFuncType::RESTORE_MAIN_WINDOW_CB):
2130              ProcessRestoreMainWindowRegister();
2131              break;
2132          case static_cast<uint32_t>(ListenerFuncType::CHANGE_SESSION_VISIBILITY_WITH_STATUS_BAR):
2133              ProcessChangeSessionVisibilityWithStatusBarRegister();
2134              break;
2135          case static_cast<uint32_t>(ListenerFuncType::SESSION_STATE_CHANGE_CB):
2136              ProcessSessionStateChangeRegister();
2137              break;
2138          case static_cast<uint32_t>(ListenerFuncType::BUFFER_AVAILABLE_CHANGE_CB):
2139              ProcessBufferAvailableChangeRegister();
2140              break;
2141          case static_cast<uint32_t>(ListenerFuncType::SESSION_EVENT_CB):
2142              ProcessSessionEventRegister();
2143              break;
2144          case static_cast<uint32_t>(ListenerFuncType::SESSION_RECT_CHANGE_CB):
2145              ProcessSessionRectChangeRegister();
2146              break;
2147          case static_cast<uint32_t>(ListenerFuncType::SESSION_PIP_CONTROL_STATUS_CHANGE_CB):
2148              ProcessSessionPiPControlStatusChangeRegister();
2149              break;
2150          case static_cast<uint32_t>(ListenerFuncType::SESSION_AUTO_START_PIP_CB):
2151              ProcessAutoStartPiPStatusChangeRegister();
2152              break;
2153          case static_cast<uint32_t>(ListenerFuncType::CREATE_SUB_SESSION_CB):
2154              ProcessCreateSubSessionRegister();
2155              break;
2156          case static_cast<uint32_t>(ListenerFuncType::BIND_DIALOG_TARGET_CB):
2157              ProcessBindDialogTargetRegister();
2158              break;
2159          case static_cast<uint32_t>(ListenerFuncType::RAISE_TO_TOP_CB):
2160              ProcessRaiseToTopRegister();
2161              break;
2162          case static_cast<uint32_t>(ListenerFuncType::RAISE_TO_TOP_POINT_DOWN_CB):
2163              ProcessRaiseToTopForPointDownRegister();
2164              break;
2165          case static_cast<uint32_t>(ListenerFuncType::BACK_PRESSED_CB):
2166              ProcessBackPressedRegister();
2167              break;
2168          case static_cast<uint32_t>(ListenerFuncType::SESSION_FOCUSABLE_CHANGE_CB):
2169              ProcessSessionFocusableChangeRegister();
2170              break;
2171          case static_cast<uint32_t>(ListenerFuncType::SESSION_TOUCHABLE_CHANGE_CB):
2172              ProcessSessionTouchableChangeRegister();
2173              break;
2174          case static_cast<uint32_t>(ListenerFuncType::SESSION_TOP_MOST_CHANGE_CB):
2175              ProcessSessionTopmostChangeRegister();
2176              break;
2177          case static_cast<uint32_t>(ListenerFuncType::MAIN_WINDOW_TOP_MOST_CHANGE_CB):
2178              ProcessMainWindowTopmostChangeRegister();
2179              break;
2180          case static_cast<uint32_t>(ListenerFuncType::SUB_MODAL_TYPE_CHANGE_CB):
2181              ProcessSubModalTypeChangeRegister();
2182              break;
2183          case static_cast<uint32_t>(ListenerFuncType::MAIN_MODAL_TYPE_CHANGE_CB):
2184              ProcessMainModalTypeChangeRegister();
2185              break;
2186          case static_cast<uint32_t>(ListenerFuncType::CLICK_CB):
2187              ProcessClickRegister();
2188              break;
2189          case static_cast<uint32_t>(ListenerFuncType::TERMINATE_SESSION_CB):
2190              ProcessTerminateSessionRegister();
2191              break;
2192          case static_cast<uint32_t>(ListenerFuncType::TERMINATE_SESSION_CB_NEW):
2193              ProcessTerminateSessionRegisterNew();
2194              break;
2195          case static_cast<uint32_t>(ListenerFuncType::TERMINATE_SESSION_CB_TOTAL):
2196              ProcessTerminateSessionRegisterTotal();
2197              break;
2198          case static_cast<uint32_t>(ListenerFuncType::SESSION_EXCEPTION_CB):
2199              ProcessSessionExceptionRegister();
2200              break;
2201          case static_cast<uint32_t>(ListenerFuncType::UPDATE_SESSION_LABEL_CB):
2202              ProcessUpdateSessionLabelRegister();
2203              break;
2204          case static_cast<uint32_t>(ListenerFuncType::UPDATE_SESSION_ICON_CB):
2205              ProcessUpdateSessionIconRegister();
2206              break;
2207          case static_cast<uint32_t>(ListenerFuncType::SYSTEMBAR_PROPERTY_CHANGE_CB):
2208              ProcessSystemBarPropertyChangeRegister();
2209              break;
2210          case static_cast<uint32_t>(ListenerFuncType::NEED_AVOID_CB):
2211              ProcessNeedAvoidRegister();
2212              break;
2213          case static_cast<uint32_t>(ListenerFuncType::PENDING_SESSION_TO_FOREGROUND_CB):
2214              ProcessPendingSessionToForegroundRegister();
2215              break;
2216          case static_cast<uint32_t>(ListenerFuncType::PENDING_SESSION_TO_BACKGROUND_FOR_DELEGATOR_CB):
2217              ProcessPendingSessionToBackgroundForDelegatorRegister();
2218              break;
2219          case static_cast<uint32_t>(ListenerFuncType::CUSTOM_ANIMATION_PLAYING_CB):
2220              ProcessIsCustomAnimationPlaying();
2221              break;
2222          case static_cast<uint32_t>(ListenerFuncType::NEED_DEFAULT_ANIMATION_FLAG_CHANGE_CB):
2223              ProcessSessionDefaultAnimationFlagChangeRegister();
2224              break;
2225          case static_cast<uint32_t>(ListenerFuncType::SHOW_WHEN_LOCKED_CB):
2226              ProcessShowWhenLockedRegister();
2227              break;
2228          case static_cast<uint32_t>(ListenerFuncType::REQUESTED_ORIENTATION_CHANGE_CB):
2229              ProcessRequestedOrientationChange();
2230              break;
2231          case static_cast<uint32_t>(ListenerFuncType::RAISE_ABOVE_TARGET_CB):
2232              ProcessRaiseAboveTargetRegister();
2233              break;
2234          case static_cast<uint32_t>(ListenerFuncType::FORCE_HIDE_CHANGE_CB):
2235              ProcessForceHideChangeRegister();
2236              break;
2237          case static_cast<uint32_t>(ListenerFuncType::WINDOW_DRAG_HOT_AREA_CB):
2238              ProcessWindowDragHotAreaRegister();
2239              break;
2240          case static_cast<uint32_t>(ListenerFuncType::TOUCH_OUTSIDE_CB):
2241              ProcessTouchOutsideRegister();
2242              break;
2243          case static_cast<uint32_t>(ListenerFuncType::SESSIONINFO_LOCKEDSTATE_CHANGE_CB):
2244              ProcessSessionInfoLockedStateChangeRegister();
2245              break;
2246          case static_cast<uint32_t>(ListenerFuncType::PREPARE_CLOSE_PIP_SESSION):
2247              ProcessPrepareClosePiPSessionRegister();
2248              break;
2249          case static_cast<uint32_t>(ListenerFuncType::LANDSCAPE_MULTI_WINDOW_CB):
2250              ProcessLandscapeMultiWindowRegister();
2251              break;
2252          case static_cast<uint32_t>(ListenerFuncType::CONTEXT_TRANSPARENT_CB):
2253              ProcessContextTransparentRegister();
2254              break;
2255          case static_cast<uint32_t>(ListenerFuncType::KEYBOARD_GRAVITY_CHANGE_CB):
2256              ProcessKeyboardGravityChangeRegister();
2257              break;
2258          case static_cast<uint32_t>(ListenerFuncType::ADJUST_KEYBOARD_LAYOUT_CB):
2259              ProcessAdjustKeyboardLayoutRegister();
2260              break;
2261          case static_cast<uint32_t>(ListenerFuncType::LAYOUT_FULL_SCREEN_CB):
2262              ProcessLayoutFullScreenChangeRegister();
2263              break;
2264          case static_cast<uint32_t>(ListenerFuncType::DEFAULT_DENSITY_ENABLED_CB):
2265              ProcessDefaultDensityEnabledRegister();
2266              break;
2267          case static_cast<uint32_t>(ListenerFuncType::TITLE_DOCK_HOVER_SHOW_CB):
2268              ProcessTitleAndDockHoverShowChangeRegister();
2269              break;
2270          case static_cast<uint32_t>(ListenerFuncType::NEXT_FRAME_LAYOUT_FINISH_CB):
2271              ProcessFrameLayoutFinishRegister();
2272              break;
2273          case static_cast<uint32_t>(ListenerFuncType::SET_WINDOW_RECT_AUTO_SAVE_CB):
2274              ProcessSetWindowRectAutoSaveRegister();
2275              break;
2276          case static_cast<uint32_t>(ListenerFuncType::UPDATE_APP_USE_CONTROL_CB):
2277              RegisterUpdateAppUseControlCallback();
2278              break;
2279          default:
2280              break;
2281      }
2282  }
2283  
OnUpdateNativeVisibility(napi_env env,napi_callback_info info)2284  napi_value JsSceneSession::OnUpdateNativeVisibility(napi_env env, napi_callback_info info)
2285  {
2286      size_t argc = 4;
2287      napi_value argv[4] = {nullptr};
2288      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2289      if (argc < 1) { // 1: params num
2290          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
2291          return NapiGetUndefined(env);
2292      }
2293      bool visible = false;
2294      if (!ConvertFromJsValue(env, argv[0], visible)) {
2295          WLOGFE("[NAPI]Failed to convert parameter to bool");
2296          return NapiGetUndefined(env);
2297      }
2298      auto session = weakSession_.promote();
2299      if (session == nullptr) {
2300          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
2301          return NapiGetUndefined(env);
2302      }
2303      session->UpdateNativeVisibility(visible);
2304      WLOGFI("[NAPI]OnUpdateNativeVisibility end");
2305      return NapiGetUndefined(env);
2306  }
2307  
OnSetPrivacyMode(napi_env env,napi_callback_info info)2308  napi_value JsSceneSession::OnSetPrivacyMode(napi_env env, napi_callback_info info)
2309  {
2310      size_t argc = 4;
2311      napi_value argv[4] = {nullptr};
2312      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2313      if (argc < 1) { // 1: params num
2314          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
2315          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2316              "Input parameter is missing or invalid"));
2317          return NapiGetUndefined(env);
2318      }
2319      bool isPrivacy = false;
2320      if (!ConvertFromJsValue(env, argv[0], isPrivacy)) {
2321          WLOGFE("[NAPI]Failed to convert parameter to bool");
2322          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2323              "Input parameter is missing or invalid"));
2324          return NapiGetUndefined(env);
2325      }
2326      auto session = weakSession_.promote();
2327      if (session == nullptr) {
2328          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
2329          return NapiGetUndefined(env);
2330      }
2331      session->SetPrivacyMode(isPrivacy);
2332      SceneSessionManager::GetInstance().UpdatePrivateStateAndNotify(session->GetPersistentId());
2333      WLOGFI("[NAPI]OnSetPrivacyMode end");
2334      return NapiGetUndefined(env);
2335  }
2336  
OnSetSystemSceneOcclusionAlpha(napi_env env,napi_callback_info info)2337  napi_value JsSceneSession::OnSetSystemSceneOcclusionAlpha(napi_env env, napi_callback_info info)
2338  {
2339      size_t argc = 4;
2340      napi_value argv[4] = {nullptr};
2341      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2342      if (argc < 1) { // 1: params num
2343          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
2344          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2345              "Input parameter is missing or invalid"));
2346          return NapiGetUndefined(env);
2347      }
2348      double alpha = 0.f;
2349      if (!ConvertFromJsValue(env, argv[0], alpha)) {
2350          WLOGFE("[NAPI]Failed to convert parameter to bool");
2351          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2352              "Input parameter is missing or invalid"));
2353          return NapiGetUndefined(env);
2354      }
2355      auto session = weakSession_.promote();
2356      if (session == nullptr) {
2357          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
2358          return NapiGetUndefined(env);
2359      }
2360      session->SetSystemSceneOcclusionAlpha(alpha);
2361      WLOGFI("[NAPI]OnSetSystemSceneOcclusionAlpha end");
2362      return NapiGetUndefined(env);
2363  }
2364  
OnSetSystemSceneForceUIFirst(napi_env env,napi_callback_info info)2365  napi_value JsSceneSession::OnSetSystemSceneForceUIFirst(napi_env env, napi_callback_info info)
2366  {
2367      size_t argc = ARG_COUNT_4;
2368      napi_value argv[ARG_COUNT_4] = {nullptr};
2369      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2370      if (argc < 1) { // 1: params num
2371          TLOGE(WmsLogTag::DEFAULT, "[NAPI]Argc is invalid: %{public}zu", argc);
2372          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2373              "Input parameter is missing or invalid"));
2374          return NapiGetUndefined(env);
2375      }
2376      bool forceUIFirst = false;
2377      if (!ConvertFromJsValue(env, argv[0], forceUIFirst)) {
2378          TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to forceUIFirst");
2379          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2380              "Input parameter is missing or invalid"));
2381          return NapiGetUndefined(env);
2382      }
2383      auto session = weakSession_.promote();
2384      if (session == nullptr) {
2385          TLOGE(WmsLogTag::DEFAULT, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
2386          return NapiGetUndefined(env);
2387      }
2388      session->SetSystemSceneForceUIFirst(forceUIFirst);
2389      TLOGD(WmsLogTag::DEFAULT, "[NAPI] end");
2390      return NapiGetUndefined(env);
2391  }
2392  
OnMarkSystemSceneUIFirst(napi_env env,napi_callback_info info)2393  napi_value JsSceneSession::OnMarkSystemSceneUIFirst(napi_env env, napi_callback_info info)
2394  {
2395      size_t argc = ARG_COUNT_4;
2396      napi_value argv[ARG_COUNT_4] = { nullptr };
2397      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2398      if (argc < ARGC_TWO) {
2399          TLOGE(WmsLogTag::DEFAULT, "[NAPI]Argc is invalid: %{public}zu", argc);
2400          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2401              "Input parameter is missing or invalid"));
2402          return NapiGetUndefined(env);
2403      }
2404      bool isForced = false;
2405      if (!ConvertFromJsValue(env, argv[ARG_INDEX_0], isForced)) {
2406          TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to isForced");
2407          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2408              "Input parameter is missing or invalid"));
2409          return NapiGetUndefined(env);
2410      }
2411      bool isUIFirstEnabled = false;
2412      if (!ConvertFromJsValue(env, argv[ARG_INDEX_1], isUIFirstEnabled)) {
2413          TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to isUIFirstEnabled");
2414          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2415              "Input parameter is missing or invalid"));
2416          return NapiGetUndefined(env);
2417      }
2418      auto session = weakSession_.promote();
2419      if (session == nullptr) {
2420          TLOGE(WmsLogTag::DEFAULT, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
2421          return NapiGetUndefined(env);
2422      }
2423      session->MarkSystemSceneUIFirst(isForced, isUIFirstEnabled);
2424      return NapiGetUndefined(env);
2425  }
2426  
OnSetFocusable(napi_env env,napi_callback_info info)2427  napi_value JsSceneSession::OnSetFocusable(napi_env env, napi_callback_info info)
2428  {
2429      size_t argc = 4;
2430      napi_value argv[4] = {nullptr};
2431      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2432      if (argc < 1) { // 1: params num
2433          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
2434          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2435              "Input parameter is missing or invalid"));
2436          return NapiGetUndefined(env);
2437      }
2438      bool isFocusable = false;
2439      if (!ConvertFromJsValue(env, argv[0], isFocusable)) {
2440          WLOGFE("[NAPI]Failed to convert parameter to bool");
2441          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2442              "Input parameter is missing or invalid"));
2443          return NapiGetUndefined(env);
2444      }
2445      auto session = weakSession_.promote();
2446      if (session == nullptr) {
2447          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
2448          return NapiGetUndefined(env);
2449      }
2450      session->SetFocusable(isFocusable);
2451      TLOGD(WmsLogTag::WMS_FOCUS, "[NAPI] end");
2452      return NapiGetUndefined(env);
2453  }
2454  
OnSetFocusableOnShow(napi_env env,napi_callback_info info)2455  napi_value JsSceneSession::OnSetFocusableOnShow(napi_env env, napi_callback_info info)
2456  {
2457      size_t argc = ARG_COUNT_4;
2458      napi_value argv[ARG_COUNT_4] = {nullptr};
2459      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2460      if (argc < 1) { // 1: params num
2461          TLOGE(WmsLogTag::WMS_FOCUS, "[NAPI]Argc is invalid: %{public}zu", argc);
2462          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2463              "Input parameter is missing or invalid"));
2464          return NapiGetUndefined(env);
2465      }
2466      bool isFocusableOnShow = true;
2467      if (!ConvertFromJsValue(env, argv[0], isFocusableOnShow)) {
2468          TLOGE(WmsLogTag::WMS_FOCUS, "[NAPI]Failed to convert parameter to bool");
2469          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2470              "Input parameter is missing or invalid"));
2471          return NapiGetUndefined(env);
2472      }
2473      auto session = weakSession_.promote();
2474      if (session == nullptr) {
2475          TLOGE(WmsLogTag::WMS_FOCUS, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
2476          return NapiGetUndefined(env);
2477      }
2478      session->SetFocusableOnShow(isFocusableOnShow);
2479      TLOGD(WmsLogTag::WMS_FOCUS, "[NAPI] end");
2480      return NapiGetUndefined(env);
2481  }
2482  
OnSetSystemSceneBlockingFocus(napi_env env,napi_callback_info info)2483  napi_value JsSceneSession::OnSetSystemSceneBlockingFocus(napi_env env, napi_callback_info info)
2484  {
2485      size_t argc = 4;
2486      napi_value argv[4] = {nullptr};
2487      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2488      if (argc < 1) { // 1: params num
2489          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
2490          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2491              "Input parameter is missing or invalid"));
2492          return NapiGetUndefined(env);
2493      }
2494      bool blocking = false;
2495      if (!ConvertFromJsValue(env, argv[0], blocking)) {
2496          WLOGFE("[NAPI]Failed to convert parameter to bool");
2497          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2498              "Input parameter is missing or invalid"));
2499          return NapiGetUndefined(env);
2500      }
2501      auto session = weakSession_.promote();
2502      if (session == nullptr) {
2503          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
2504          return NapiGetUndefined(env);
2505      }
2506      session->SetSystemSceneBlockingFocus(blocking);
2507      WLOGFI("[NAPI]OnSetSystemSceneBlockingFocus end");
2508      return NapiGetUndefined(env);
2509  }
2510  
OnUpdateSizeChangeReason(napi_env env,napi_callback_info info)2511  napi_value JsSceneSession::OnUpdateSizeChangeReason(napi_env env, napi_callback_info info)
2512  {
2513      size_t argc = 4;
2514      napi_value argv[4] = {nullptr};
2515      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2516      if (argc < 1) { // 1: params num
2517          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
2518          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2519              "Input parameter is missing or invalid"));
2520          return NapiGetUndefined(env);
2521      }
2522      SizeChangeReason reason = SizeChangeReason::UNDEFINED;
2523      if (!ConvertFromJsValue(env, argv[0], reason)) {
2524          WLOGFE("[NAPI]Failed to convert parameter to bool");
2525          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2526              "Input parameter is missing or invalid"));
2527          return NapiGetUndefined(env);
2528      }
2529      auto session = weakSession_.promote();
2530      if (session == nullptr) {
2531          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
2532          return NapiGetUndefined(env);
2533      }
2534      session->UpdateSizeChangeReason(reason);
2535      WLOGI("[NAPI]UpdateSizeChangeReason reason: %{public}u end", reason);
2536      return NapiGetUndefined(env);
2537  }
2538  
OnOpenKeyboardSyncTransaction(napi_env env,napi_callback_info info)2539  napi_value JsSceneSession::OnOpenKeyboardSyncTransaction(napi_env env, napi_callback_info info)
2540  {
2541      auto session = weakSession_.promote();
2542      if (session == nullptr) {
2543          TLOGE(WmsLogTag::WMS_KEYBOARD, "[NAPI] session is nullptr, id:%{public}d", persistentId_);
2544          return NapiGetUndefined(env);
2545      }
2546      session->OpenKeyboardSyncTransaction();
2547      return NapiGetUndefined(env);
2548  }
2549  
OnCloseKeyboardSyncTransaction(napi_env env,napi_callback_info info)2550  napi_value JsSceneSession::OnCloseKeyboardSyncTransaction(napi_env env, napi_callback_info info)
2551  {
2552      size_t argc = ARG_COUNT_4;
2553      napi_value argv[ARG_COUNT_4] = {nullptr};
2554      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2555      if (argc < 3) { // 3: params num
2556          TLOGE(WmsLogTag::WMS_KEYBOARD, "[NAPI]Argc is invalid: %{public}zu", argc);
2557          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2558              "Input parameter is missing or invalid"));
2559          return NapiGetUndefined(env);
2560      }
2561  
2562      WSRect keyboardPanelRect = { 0, 0, 0, 0 };
2563      napi_value nativeObj = argv[ARG_INDEX_0];
2564      if (nativeObj == nullptr || !ConvertRectInfoFromJs(env, nativeObj, keyboardPanelRect)) {
2565          TLOGE(WmsLogTag::WMS_KEYBOARD, "[NAPI]Failed to convert parameter to keyboardPanelRect");
2566          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2567              "Input parameter is missing or invalid"));
2568          return NapiGetUndefined(env);
2569      }
2570  
2571      bool isKeyboardShow = false;
2572      if (!ConvertFromJsValue(env, argv[ARG_INDEX_1], isKeyboardShow)) {
2573          TLOGE(WmsLogTag::WMS_KEYBOARD, "[NAPI]Failed to convert parameter to bool");
2574          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2575              "Input parameter is missing or invalid"));
2576          return NapiGetUndefined(env);
2577      }
2578  
2579      bool isRotating = false;
2580      if (!ConvertFromJsValue(env, argv[ARG_INDEX_2], isRotating)) {
2581          TLOGE(WmsLogTag::WMS_KEYBOARD, "[NAPI]Failed to convert parameter to bool");
2582          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2583              "Input parameter is missing or invalid"));
2584          return NapiGetUndefined(env);
2585      }
2586  
2587      auto session = weakSession_.promote();
2588      if (session == nullptr) {
2589          TLOGE(WmsLogTag::WMS_KEYBOARD, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
2590          return NapiGetUndefined(env);
2591      }
2592      session->CloseKeyboardSyncTransaction(keyboardPanelRect, isKeyboardShow, isRotating);
2593      return NapiGetUndefined(env);
2594  }
2595  
OnNotifyTargetScreenWidthAndHeight(napi_env env,napi_callback_info info)2596  napi_value JsSceneSession::OnNotifyTargetScreenWidthAndHeight(napi_env env, napi_callback_info info)
2597  {
2598      size_t argc = ARG_COUNT_4;
2599      napi_value argv[ARG_COUNT_4] = {nullptr};
2600      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2601      if (argc < ARG_COUNT_3) {
2602          TLOGE(WmsLogTag::WMS_KEYBOARD, "[NAPI]Argc is invalid: %{public}zu", argc);
2603          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2604              "Input parameter is missing or invalid"));
2605          return NapiGetUndefined(env);
2606      }
2607  
2608      bool isScreenAngleMismatch = false;
2609      if (!ConvertFromJsValue(env, argv[ARG_INDEX_0], isScreenAngleMismatch)) {
2610          TLOGE(WmsLogTag::WMS_KEYBOARD, "[NAPI]Failed to convert parameter to bool");
2611          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2612              "Input parameter is missing or invalid"));
2613          return NapiGetUndefined(env);
2614      }
2615  
2616      uint32_t screenWidth = 0;
2617      if (!ConvertFromJsValue(env, argv[ARG_INDEX_1], screenWidth)) {
2618          TLOGE(WmsLogTag::WMS_KEYBOARD, "[NAPI]Failed to convert parameter to uint32_t");
2619          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2620              "Input parameter is missing or invalid"));
2621          return NapiGetUndefined(env);
2622      }
2623  
2624      uint32_t screenHeight = 0;
2625      if (!ConvertFromJsValue(env, argv[ARG_INDEX_2], screenHeight)) {
2626          TLOGE(WmsLogTag::WMS_KEYBOARD, "[NAPI]Failed to convert parameter to uint32_t");
2627          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2628              "Input parameter is missing or invalid"));
2629          return NapiGetUndefined(env);
2630      }
2631  
2632      auto session = weakSession_.promote();
2633      if (session == nullptr) {
2634          TLOGE(WmsLogTag::WMS_KEYBOARD, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
2635          return NapiGetUndefined(env);
2636      }
2637      session->NotifyTargetScreenWidthAndHeight(isScreenAngleMismatch, screenWidth, screenHeight);
2638      return NapiGetUndefined(env);
2639  }
2640  
OnCreateSubSession(const sptr<SceneSession> & sceneSession)2641  void JsSceneSession::OnCreateSubSession(const sptr<SceneSession>& sceneSession)
2642  {
2643      if (sceneSession == nullptr) {
2644          WLOGFE("[NAPI]sceneSession is nullptr");
2645          return;
2646      }
2647  
2648      TLOGI(WmsLogTag::WMS_LIFE, "[NAPI]OnCreateSubSession, id: %{public}d, parentId: %{public}d",
2649          sceneSession->GetPersistentId(), sceneSession->GetParentPersistentId());
2650      wptr<SceneSession> weakSession(sceneSession);
2651      auto task = [weakThis = wptr(this), persistentId = persistentId_, weakSession, env = env_] {
2652          auto jsSceneSession = weakThis.promote();
2653          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2654              TLOGE(WmsLogTag::WMS_LIFE, "OnCreateSubSession jsSceneSession id:%{public}d has been destroyed",
2655                  persistentId);
2656              return;
2657          }
2658          auto jsCallBack = jsSceneSession->GetJSCallback(CREATE_SUB_SESSION_CB);
2659          if (jsCallBack == nullptr) {
2660              WLOGFE("[NAPI]jsCallBack is nullptr");
2661              return;
2662          }
2663          auto specificSession = weakSession.promote();
2664          if (specificSession == nullptr) {
2665              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]root session or target session or env is nullptr");
2666              return;
2667          }
2668          napi_value jsSceneSessionObj = Create(env, specificSession);
2669          if (jsSceneSessionObj == nullptr || !jsCallBack) {
2670              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]jsSceneSessionObj or jsCallBack is nullptr");
2671              return;
2672          }
2673          TLOGI(WmsLogTag::WMS_LIFE, "CreateJsSceneSessionObject success, id: %{public}d, parentId: %{public}d",
2674              specificSession->GetPersistentId(), specificSession->GetParentPersistentId());
2675          napi_value argv[] = {jsSceneSessionObj};
2676          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
2677      };
2678      std::string info = "OnCreateSpecificSession PID:" + std::to_string(sceneSession->GetPersistentId());
2679      taskScheduler_->PostMainThreadTask(task, info);
2680  }
2681  
OnBindDialogTarget(const sptr<SceneSession> & sceneSession)2682  void JsSceneSession::OnBindDialogTarget(const sptr<SceneSession>& sceneSession)
2683  {
2684      if (sceneSession == nullptr) {
2685          WLOGFI("[NAPI]sceneSession is nullptr");
2686          return;
2687      }
2688  
2689      TLOGI(WmsLogTag::WMS_DIALOG, "OnBindDialogTarget, id: %{public}d", sceneSession->GetPersistentId());
2690  
2691      wptr<SceneSession> weakSession(sceneSession);
2692      auto task = [weakThis = wptr(this), persistentId = persistentId_, weakSession, env = env_] {
2693          auto jsSceneSession = weakThis.promote();
2694          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2695              TLOGE(WmsLogTag::WMS_LIFE, "OnBindDialogTarget jsSceneSession id:%{public}d has been destroyed",
2696                  persistentId);
2697              return;
2698          }
2699          auto jsCallBack = jsSceneSession->GetJSCallback(BIND_DIALOG_TARGET_CB);
2700          if (jsCallBack == nullptr) {
2701              WLOGFE("[NAPI]jsCallBack is nullptr");
2702              return;
2703          }
2704          auto specificSession = weakSession.promote();
2705          if (specificSession == nullptr) {
2706              WLOGFE("[NAPI]root session or target session or env is nullptr");
2707              return;
2708          }
2709          napi_value jsSceneSessionObj = Create(env, specificSession);
2710          if (jsSceneSessionObj == nullptr || !jsCallBack) {
2711              WLOGFE("[NAPI]jsSceneSessionObj or jsCallBack is nullptr");
2712              return;
2713          }
2714          TLOGI(WmsLogTag::WMS_DIALOG, "CreateJsObject success, id: %{public}d", specificSession->GetPersistentId());
2715          napi_value argv[] = {jsSceneSessionObj};
2716          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
2717      };
2718      taskScheduler_->PostMainThreadTask(task, "OnBindDialogTarget, PID:" +
2719          std::to_string(sceneSession->GetPersistentId()));
2720  }
2721  
OnSessionStateChange(const SessionState & state)2722  void JsSceneSession::OnSessionStateChange(const SessionState& state)
2723  {
2724      auto session = weakSession_.promote();
2725      if (session == nullptr) {
2726          TLOGW(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
2727          return;
2728      }
2729  
2730      TLOGI(WmsLogTag::WMS_LIFE, "id: %{public}d, state: %{public}d", session->GetPersistentId(), state);
2731      auto task = [weakThis = wptr(this), persistentId = persistentId_, state, env = env_] {
2732          auto jsSceneSession = weakThis.promote();
2733          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2734              TLOGE(WmsLogTag::WMS_LIFE, "OnSessionStateChange jsSceneSession id:%{public}d has been destroyed",
2735                  persistentId);
2736              return;
2737          }
2738          auto jsCallBack = jsSceneSession->GetJSCallback(SESSION_STATE_CHANGE_CB);
2739          if (!jsCallBack) {
2740              WLOGFE("[NAPI]jsCallBack is nullptr");
2741              return;
2742          }
2743          napi_value jsSessionStateObj = CreateJsValue(env, state);
2744          napi_value argv[] = {jsSessionStateObj};
2745          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
2746      };
2747      taskScheduler_->PostMainThreadTask(task, "OnSessionStateChange, state:" + std::to_string(static_cast<int>(state)));
2748  }
2749  
OnBufferAvailableChange(const bool isBufferAvailable)2750  void JsSceneSession::OnBufferAvailableChange(const bool isBufferAvailable)
2751  {
2752      WLOGFD("[NAPI]OnBufferAvailableChange, state: %{public}u", isBufferAvailable);
2753      auto task = [weakThis = wptr(this), persistentId = persistentId_, isBufferAvailable, env = env_] {
2754          auto jsSceneSession = weakThis.promote();
2755          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2756              TLOGE(WmsLogTag::WMS_LIFE, "OnBufferAvailableChange jsSceneSession id:%{public}d has been destroyed",
2757                  persistentId);
2758              return;
2759          }
2760          auto jsCallBack = jsSceneSession->GetJSCallback(BUFFER_AVAILABLE_CHANGE_CB);
2761          if (!jsCallBack) {
2762              WLOGFE("[NAPI]jsCallBack is nullptr");
2763              return;
2764          }
2765          napi_value jsBufferAvailableObj = CreateJsValue(env, isBufferAvailable);
2766          napi_value argv[] = { jsBufferAvailableObj };
2767          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
2768      };
2769      taskScheduler_->PostMainThreadTask(task);
2770  }
2771  
OnSessionRectChange(const WSRect & rect,const SizeChangeReason & reason)2772  void JsSceneSession::OnSessionRectChange(const WSRect& rect, const SizeChangeReason& reason)
2773  {
2774      if (!IsMoveToOrDragMove(reason) && reason != SizeChangeReason::PIP_RESTORE && rect.IsEmpty()) {
2775          WLOGFD("Rect is empty, there is no need to notify");
2776          return;
2777      }
2778      WLOGFD("[NAPI]OnSessionRectChange");
2779  
2780      auto task = [weakThis = wptr(this), persistentId = persistentId_, rect, reason, env = env_] {
2781          auto jsSceneSession = weakThis.promote();
2782          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2783              TLOGE(WmsLogTag::WMS_LIFE, "OnSessionRectChange jsSceneSession id:%{public}d has been destroyed",
2784                  persistentId);
2785              return;
2786          }
2787          auto jsCallBack = jsSceneSession->GetJSCallback(SESSION_RECT_CHANGE_CB);
2788          if (!jsCallBack) {
2789              WLOGFE("[NAPI]jsCallBack is nullptr");
2790              return;
2791          }
2792          napi_value jsSessionStateObj = CreateJsSessionRect(env, rect);
2793          napi_value sizeChangeReason = CreateJsValue(env, static_cast<int32_t>(reason));
2794          napi_value argv[] = {jsSessionStateObj, sizeChangeReason};
2795          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
2796      };
2797      std::string rectInfo = "OnSessionRectChange [" + std::to_string(rect.posX_) + "," + std::to_string(rect.posY_)
2798          + "], [" + std::to_string(rect.width_) + ", " + std::to_string(rect.height_);
2799      taskScheduler_->PostMainThreadTask(task, rectInfo);
2800  }
2801  
OnSessionPiPControlStatusChange(WsPiPControlType controlType,WsPiPControlStatus status)2802  void JsSceneSession::OnSessionPiPControlStatusChange(WsPiPControlType controlType, WsPiPControlStatus status)
2803  {
2804      TLOGI(WmsLogTag::WMS_PIP, "controlType:%{public}u, status:%{public}d", controlType, status);
2805      auto task = [weakThis = wptr(this), persistentId = persistentId_, controlType, status, env = env_] {
2806          auto jsSceneSession = weakThis.promote();
2807          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2808              TLOGE(WmsLogTag::WMS_LIFE, "OnSessionPiPControlStatusChange jsSceneSession id:%{public}d has been"
2809                  " destroyed", persistentId);
2810              return;
2811          }
2812          auto jsCallBack = jsSceneSession->GetJSCallback(SESSION_PIP_CONTROL_STATUS_CHANGE_CB);
2813          if (!jsCallBack) {
2814              TLOGE(WmsLogTag::WMS_PIP, "[NAPI]jsCallBack is nullptr");
2815              return;
2816          }
2817          napi_value controlTypeValue = CreateJsValue(env, controlType);
2818          napi_value controlStatusValue = CreateJsValue(env, status);
2819          napi_value argv[] = {controlTypeValue, controlStatusValue};
2820          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
2821      };
2822      taskScheduler_->PostMainThreadTask(task, __func__);
2823  }
2824  
OnSetFrameGravity(napi_env env,napi_callback_info info)2825  napi_value JsSceneSession::OnSetFrameGravity(napi_env env, napi_callback_info info)
2826  {
2827      size_t argc = ARGC_FOUR;
2828      napi_value argv[ARGC_FOUR] = { nullptr };
2829      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2830      if (argc != ARGC_ONE) {
2831          TLOGE(WmsLogTag::DEFAULT, "[NAPI]Argc is invalid: %{public}zu", argc);
2832          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2833              "Input parameter is missing or invalid"));
2834          return NapiGetUndefined(env);
2835      }
2836      Gravity gravity = Gravity::TOP_LEFT;
2837      if (!ConvertFromJsValue(env, argv[0], gravity)) {
2838          TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to gravity");
2839          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
2840              "Input parameter is missing or invalid"));
2841          return NapiGetUndefined(env);
2842      }
2843      auto session = weakSession_.promote();
2844      if (session == nullptr) {
2845          TLOGE(WmsLogTag::DEFAULT, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
2846          return NapiGetUndefined(env);
2847      }
2848      session->SetFrameGravity(gravity);
2849      return NapiGetUndefined(env);
2850  }
2851  
OnAutoStartPiPStatusChange(bool isAutoStart,uint32_t priority)2852  void JsSceneSession::OnAutoStartPiPStatusChange(bool isAutoStart, uint32_t priority)
2853  {
2854      TLOGI(WmsLogTag::WMS_PIP, "isAutoStart:%{public}u priority:%{public}u", isAutoStart, priority);
2855      auto task = [weakThis = wptr(this), persistentId = persistentId_, isAutoStart, priority, env = env_] {
2856          auto jsSceneSession = weakThis.promote();
2857          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2858              TLOGNE(WmsLogTag::WMS_PIP, "jsSceneSession id:%{public}d has been destroyed", persistentId);
2859              return;
2860          }
2861          auto jsCallBack = jsSceneSession->GetJSCallback(SESSION_AUTO_START_PIP_CB);
2862          if (!jsCallBack) {
2863              TLOGNE(WmsLogTag::WMS_PIP, "[NAPI]jsCallBack is nullptr");
2864              return;
2865          }
2866          napi_value isAutoStartValue = CreateJsValue(env, isAutoStart);
2867          napi_value priorityValue = CreateJsValue(env, priority);
2868          napi_value argv[] = {isAutoStartValue, priorityValue};
2869          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
2870      };
2871      taskScheduler_->PostMainThreadTask(task, __func__);
2872  }
2873  
2874  /** @note @window.hierarchy */
OnRaiseToTop()2875  void JsSceneSession::OnRaiseToTop()
2876  {
2877      WLOGFI("[NAPI]OnRaiseToTop");
2878  
2879      auto task = [weakThis = wptr(this), persistentId = persistentId_, env = env_] {
2880          auto jsSceneSession = weakThis.promote();
2881          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2882              TLOGE(WmsLogTag::WMS_LIFE, "OnRaiseToTop jsSceneSession id:%{public}d has been destroyed",
2883                  persistentId);
2884              return;
2885          }
2886          auto jsCallBack = jsSceneSession->GetJSCallback(RAISE_TO_TOP_CB);
2887          if (!jsCallBack) {
2888              WLOGFE("[NAPI]jsCallBack is nullptr");
2889              return;
2890          }
2891          napi_value argv[] = {};
2892          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), 0, argv, nullptr);
2893      };
2894      taskScheduler_->PostMainThreadTask(task, "OnRaiseToTop");
2895  }
2896  
2897  /** @note @window.hierarchy */
OnRaiseToTopForPointDown()2898  void JsSceneSession::OnRaiseToTopForPointDown()
2899  {
2900      WLOGFI("[NAPI]OnRaiseToTopForPointDown");
2901  
2902      auto task = [weakThis = wptr(this), persistentId = persistentId_, env = env_] {
2903          auto jsSceneSession = weakThis.promote();
2904          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2905              TLOGE(WmsLogTag::WMS_LIFE, "OnRaiseToTopForPointDown jsSceneSession id:%{public}d has been destroyed",
2906                  persistentId);
2907              return;
2908          }
2909          auto jsCallBack = jsSceneSession->GetJSCallback(RAISE_TO_TOP_POINT_DOWN_CB);
2910          if (!jsCallBack) {
2911              WLOGFE("[NAPI]jsCallBack is nullptr");
2912              return;
2913          }
2914          napi_value argv[] = {};
2915          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), 0, argv, nullptr);
2916      };
2917      taskScheduler_->PostMainThreadTask(task, "OnRaiseToTopForPointDown");
2918  }
2919  
OnRaiseAboveTarget(int32_t subWindowId)2920  void JsSceneSession::OnRaiseAboveTarget(int32_t subWindowId)
2921  {
2922      WLOGFI("[NAPI]OnRaiseAboveTarget");
2923      auto task = [weakThis = wptr(this), persistentId = persistentId_, env = env_, subWindowId] {
2924          auto jsSceneSession = weakThis.promote();
2925          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2926              TLOGE(WmsLogTag::WMS_LIFE, "OnRaiseAboveTarget jsSceneSession id:%{public}d has been destroyed",
2927                  persistentId);
2928              return;
2929          }
2930          auto jsCallBack = jsSceneSession->GetJSCallback(RAISE_ABOVE_TARGET_CB);
2931          if (!jsCallBack) {
2932              WLOGFE("[NAPI]jsCallBack is nullptr");
2933              return;
2934          }
2935          napi_value jsSceneSessionObj = CreateJsValue(env, subWindowId);
2936          if (jsSceneSessionObj == nullptr) {
2937              WLOGFE("[NAPI]jsSceneSessionObj is nullptr");
2938              return;
2939          }
2940          napi_value argv[] = {CreateJsError(env, 0), jsSceneSessionObj};
2941          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
2942      };
2943      taskScheduler_->PostMainThreadTask(task, "OnRaiseAboveTarget: " + std::to_string(subWindowId));
2944  }
2945  
OnSessionFocusableChange(bool isFocusable)2946  void JsSceneSession::OnSessionFocusableChange(bool isFocusable)
2947  {
2948      TLOGD(WmsLogTag::WMS_FOCUS, "[NAPI]OnSessionFocusableChange, state: %{public}u", isFocusable);
2949      auto task = [weakThis = wptr(this), persistentId = persistentId_, isFocusable, env = env_] {
2950          auto jsSceneSession = weakThis.promote();
2951          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2952              TLOGE(WmsLogTag::WMS_LIFE, "OnSessionFocusableChange jsSceneSession id:%{public}d has been destroyed",
2953                  persistentId);
2954              return;
2955          }
2956          auto jsCallBack = jsSceneSession->GetJSCallback(SESSION_FOCUSABLE_CHANGE_CB);
2957          if (!jsCallBack) {
2958              WLOGFE("[NAPI]jsCallBack is nullptr");
2959              return;
2960          }
2961          napi_value jsSessionFocusableObj = CreateJsValue(env, isFocusable);
2962          napi_value argv[] = {jsSessionFocusableObj};
2963          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
2964      };
2965      taskScheduler_->PostMainThreadTask(task, "OnSessionFocusableChange, state:" + std::to_string(isFocusable));
2966  }
2967  
OnSessionTouchableChange(bool touchable)2968  void JsSceneSession::OnSessionTouchableChange(bool touchable)
2969  {
2970      WLOGFI("[NAPI]OnSessionTouchableChange, state: %{public}u", touchable);
2971  
2972      auto task = [weakThis = wptr(this), persistentId = persistentId_, touchable, env = env_] {
2973          auto jsSceneSession = weakThis.promote();
2974          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2975              TLOGE(WmsLogTag::WMS_LIFE, "OnSessionTouchableChange jsSceneSession id:%{public}d has been destroyed",
2976                  persistentId);
2977              return;
2978          }
2979          auto jsCallBack = jsSceneSession->GetJSCallback(SESSION_TOUCHABLE_CHANGE_CB);
2980          if (!jsCallBack) {
2981              WLOGFE("[NAPI]jsCallBack is nullptr");
2982              return;
2983          }
2984          napi_value jsSessionTouchableObj = CreateJsValue(env, touchable);
2985          napi_value argv[] = {jsSessionTouchableObj};
2986          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
2987      };
2988      taskScheduler_->PostMainThreadTask(task, "OnSessionTouchableChange: state " + std::to_string(touchable));
2989  }
2990  
2991  /** @note @window.hierarchy */
OnSessionTopmostChange(bool topmost)2992  void JsSceneSession::OnSessionTopmostChange(bool topmost)
2993  {
2994      TLOGI(WmsLogTag::WMS_LAYOUT, "[NAPI]State: %{public}u", topmost);
2995      auto task = [weakThis = wptr(this), persistentId = persistentId_, topmost, env = env_] {
2996          auto jsSceneSession = weakThis.promote();
2997          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
2998              TLOGE(WmsLogTag::WMS_LIFE, "OnSessionTopmostChange jsSceneSession id:%{public}d has been destroyed",
2999                  persistentId);
3000              return;
3001          }
3002          auto jsCallBack = jsSceneSession->GetJSCallback(SESSION_TOP_MOST_CHANGE_CB);
3003          if (!jsCallBack) {
3004              TLOGE(WmsLogTag::WMS_LAYOUT, "[NAPI]jsCallBack is nullptr");
3005              return;
3006          }
3007          napi_value jsSessionTouchableObj = CreateJsValue(env, topmost);
3008          napi_value argv[] = {jsSessionTouchableObj};
3009          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3010      };
3011      taskScheduler_->PostMainThreadTask(task, "OnSessionTopmostChange: state " + std::to_string(topmost));
3012  }
3013  
3014  /** @note @window.hierarchy */
OnMainWindowTopmostChange(bool isTopmost)3015  void JsSceneSession::OnMainWindowTopmostChange(bool isTopmost)
3016  {
3017      TLOGD(WmsLogTag::WMS_HIERARCHY, "isTopmost: %{public}u", isTopmost);
3018      const char* const where = __func__;
3019      taskScheduler_->PostMainThreadTask([weakThis = wptr(this), persistentId = persistentId_,
3020          isTopmost, env = env_, where] {
3021          auto jsSceneSession = weakThis.promote();
3022          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3023              TLOGNE(WmsLogTag::WMS_HIERARCHY, "%{public}s jsSceneSession id:%{public}d has been destroyed",
3024                  where, persistentId);
3025              return;
3026          }
3027          auto jsCallBack = jsSceneSession->GetJSCallback(MAIN_WINDOW_TOP_MOST_CHANGE_CB);
3028          if (!jsCallBack) {
3029              TLOGNE(WmsLogTag::WMS_HIERARCHY, "jsCallBack is nullptr");
3030              return;
3031          }
3032          napi_value jsMainWindowTopmostObj = CreateJsValue(env, isTopmost);
3033          napi_value argv[] = { jsMainWindowTopmostObj };
3034          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3035      }, "OnMainWindowTopmostChange: " + std::to_string(isTopmost));
3036  }
3037  
OnSubModalTypeChange(SubWindowModalType subWindowModalType)3038  void JsSceneSession::OnSubModalTypeChange(SubWindowModalType subWindowModalType)
3039  {
3040      const char* const where = __func__;
3041      auto task = [weakThis = wptr(this), persistentId = persistentId_, subWindowModalType, env = env_, where] {
3042          auto jsSceneSession = weakThis.promote();
3043          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3044              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession id:%{public}d has been destroyed",
3045                  where, persistentId);
3046              return;
3047          }
3048          auto jsCallBack = jsSceneSession->GetJSCallback(SUB_MODAL_TYPE_CHANGE_CB);
3049          if (!jsCallBack) {
3050              TLOGNE(WmsLogTag::WMS_HIERARCHY, "%{public}s jsCallBack is nullptr", where);
3051              return;
3052          }
3053          napi_value jsSessionModalTypeObj = CreateJsValue(env, subWindowModalType);
3054          napi_value argv[] = {jsSessionModalTypeObj};
3055          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3056      };
3057      taskScheduler_->PostMainThreadTask(task,
3058          "OnSubModalTypeChange: " + std::to_string(static_cast<uint32_t>(subWindowModalType)));
3059  }
3060  
OnMainModalTypeChange(bool isModal)3061  void JsSceneSession::OnMainModalTypeChange(bool isModal)
3062  {
3063      const char* const where = __func__;
3064      auto task = [weakThis = wptr(this), persistentId = persistentId_, isModal, env = env_, where] {
3065          auto jsSceneSession = weakThis.promote();
3066          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3067              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s jsSceneSession id:%{public}d has been destroyed",
3068                  where, persistentId);
3069              return;
3070          }
3071          auto jsCallBack = jsSceneSession->GetJSCallback(MAIN_MODAL_TYPE_CHANGE_CB);
3072          if (!jsCallBack) {
3073              TLOGNE(WmsLogTag::WMS_HIERARCHY, "%{public}s jsCallBack is nullptr", where);
3074              return;
3075          }
3076          napi_value jsMainSessionModalType = CreateJsValue(env, isModal);
3077          napi_value argv[] = {jsMainSessionModalType};
3078          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3079      };
3080      taskScheduler_->PostMainThreadTask(task, "OnMainModalTypeChange: " + std::to_string(isModal));
3081  }
3082  
OnClick()3083  void JsSceneSession::OnClick()
3084  {
3085      WLOGFD("[NAPI]OnClick");
3086      auto task = [weakThis = wptr(this), persistentId = persistentId_, env = env_] {
3087          auto jsSceneSession = weakThis.promote();
3088          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3089              TLOGE(WmsLogTag::WMS_LIFE, "OnClick jsSceneSession id:%{public}d has been destroyed",
3090                  persistentId);
3091              return;
3092          }
3093          auto jsCallBack = jsSceneSession->GetJSCallback(CLICK_CB);
3094          if (!jsCallBack) {
3095              WLOGFE("[NAPI]jsCallBack is nullptr");
3096              return;
3097          }
3098          napi_value argv[] = {};
3099          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), 0, argv, nullptr);
3100      };
3101      taskScheduler_->PostMainThreadTask(task, "OnClick");
3102  }
3103  
OnContextTransparent()3104  void JsSceneSession::OnContextTransparent()
3105  {
3106      WLOGFD("[NAPI]OnContextTransparent");
3107  
3108      auto task = [weakThis = wptr(this), persistentId = persistentId_, env = env_] {
3109          auto jsSceneSession = weakThis.promote();
3110          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3111              TLOGE(WmsLogTag::WMS_LIFE, "OnContextTransparent jsSceneSession id:%{public}d has been destroyed",
3112                  persistentId);
3113              return;
3114          }
3115          auto jsCallBack = jsSceneSession->GetJSCallback(CONTEXT_TRANSPARENT_CB);
3116          if (!jsCallBack) {
3117              WLOGFE("[NAPI]jsCallBack is nullptr");
3118              return;
3119          }
3120          napi_value argv[] = {};
3121          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), 0, argv, nullptr);
3122      };
3123      taskScheduler_->PostMainThreadTask(task, "OnContextTransparent");
3124  }
3125  
ChangeSessionVisibilityWithStatusBar(SessionInfo & info,bool visible)3126  void JsSceneSession::ChangeSessionVisibilityWithStatusBar(SessionInfo& info, bool visible)
3127  {
3128      WLOGI("[NAPI]: bundleName %{public}s, moduleName %{public}s, "
3129          "abilityName %{public}s, appIndex %{public}d, reuse %{public}d, visible %{public}d",
3130          info.bundleName_.c_str(), info.moduleName_.c_str(), info.abilityName_.c_str(),
3131          info.appIndex_, info.reuse, visible);
3132      auto session = weakSession_.promote();
3133      if (session == nullptr) {
3134          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
3135          return;
3136      }
3137      std::shared_ptr<SessionInfo> sessionInfo = std::make_shared<SessionInfo>(info);
3138      auto task = [weakThis = wptr(this), sessionInfo, visible]() {
3139          auto jsSceneSession = weakThis.promote();
3140          if (!jsSceneSession) {
3141              TLOGE(WmsLogTag::WMS_LIFE, "ChangeSessionVisibilityWithStatusBar jsSceneSession is null");
3142              return;
3143          }
3144          jsSceneSession->ChangeSessionVisibilityWithStatusBarInner(sessionInfo, visible);
3145      };
3146      taskScheduler_->PostMainThreadTask(task, "ChangeSessionVisibilityWithStatusBar, visible:" +
3147          std::to_string(visible));
3148  }
3149  
ChangeSessionVisibilityWithStatusBarInner(std::shared_ptr<SessionInfo> sessionInfo,bool visible)3150  void JsSceneSession::ChangeSessionVisibilityWithStatusBarInner(std::shared_ptr<SessionInfo> sessionInfo, bool visible)
3151  {
3152      std::shared_ptr<NativeReference> jsCallBack = GetJSCallback(CHANGE_SESSION_VISIBILITY_WITH_STATUS_BAR);
3153      if (!jsCallBack) {
3154          WLOGFE("[NAPI]jsCallBack is nullptr");
3155          return;
3156      }
3157      if (sessionInfo == nullptr) {
3158          WLOGFE("[NAPI]sessionInfo is nullptr");
3159          return;
3160      }
3161      napi_value jsSessionInfo = CreateJsSessionInfo(env_, *sessionInfo);
3162      if (jsSessionInfo == nullptr) {
3163          WLOGFE("[NAPI]this target session info is nullptr");
3164          return;
3165      }
3166      napi_value visibleNapiV = CreateJsValue(env_, visible);
3167      napi_value argv[] = {jsSessionInfo, visibleNapiV};
3168      napi_call_function(env_, NapiGetUndefined(env_),
3169          jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3170  }
3171  
GenSceneSession(SessionInfo & info)3172  sptr<SceneSession> JsSceneSession::GenSceneSession(SessionInfo& info)
3173  {
3174      sptr<SceneSession> sceneSession = nullptr;
3175      if (info.persistentId_ == 0) {
3176          auto result = SceneSessionManager::GetInstance().CheckIfReuseSession(info);
3177          if (result == BrokerStates::BROKER_NOT_START) {
3178              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]BrokerStates not started");
3179              return nullptr;
3180          }
3181          if (info.reuse || info.isAtomicService_) {
3182              TLOGI(WmsLogTag::WMS_LIFE, "session need to be reusesd.");
3183              if (SceneSessionManager::GetInstance().CheckCollaboratorType(info.collaboratorType_)) {
3184                  sceneSession = SceneSessionManager::GetInstance().FindSessionByAffinity(info.sessionAffinity);
3185              } else {
3186                  ComparedSessionInfo compareSessionInfo = { info.bundleName_, info.moduleName_, info.abilityName_,
3187                      info.appIndex_, info.windowType_, info.isAtomicService_ };
3188                  sceneSession = SceneSessionManager::GetInstance().GetSceneSessionByName(compareSessionInfo);
3189              }
3190          }
3191          if (sceneSession == nullptr) {
3192              TLOGI(WmsLogTag::WMS_LIFE, "GetSceneSessionByName return nullptr, RequestSceneSession");
3193              sceneSession = SceneSessionManager::GetInstance().RequestSceneSession(info);
3194              if (sceneSession == nullptr) {
3195                  TLOGE(WmsLogTag::WMS_LIFE, "RequestSceneSession return nullptr");
3196                  return nullptr;
3197              }
3198          } else {
3199              sceneSession->SetSessionInfo(info);
3200          }
3201          info.persistentId_ = sceneSession->GetPersistentId();
3202          sceneSession->SetSessionInfoPersistentId(sceneSession->GetPersistentId());
3203      } else {
3204          sceneSession = SceneSessionManager::GetInstance().GetSceneSession(info.persistentId_);
3205          if (sceneSession == nullptr) {
3206              TLOGE(WmsLogTag::WMS_LIFE, "GetSceneSession return nullptr");
3207              sceneSession = SceneSessionManager::GetInstance().RequestSceneSession(info);
3208              if (sceneSession == nullptr) {
3209                  TLOGE(WmsLogTag::WMS_LIFE, "retry RequestSceneSession return nullptr");
3210                  return nullptr;
3211              }
3212              info.persistentId_ = sceneSession->GetPersistentId();
3213              sceneSession->SetSessionInfoPersistentId(sceneSession->GetPersistentId());
3214          } else {
3215              sceneSession->SetSessionInfo(info);
3216          }
3217      }
3218      sceneSession->SetSessionInfoProcessOptions(info.processOptions);
3219      return sceneSession;
3220  }
3221  
PendingSessionActivation(SessionInfo & info)3222  void JsSceneSession::PendingSessionActivation(SessionInfo& info)
3223  {
3224      TLOGI(WmsLogTag::WMS_LIFE, "[NAPI]bundleName %{public}s, moduleName %{public}s, abilityName %{public}s, "
3225          "appIndex %{public}d, reuse %{public}d", info.bundleName_.c_str(), info.moduleName_.c_str(),
3226          info.abilityName_.c_str(), info.appIndex_, info.reuse);
3227      auto sceneSession = GenSceneSession(info);
3228      if (sceneSession == nullptr) {
3229          TLOGE(WmsLogTag::WMS_LIFE, "GenSceneSession failed");
3230          return;
3231      }
3232  
3233      if (info.want != nullptr) {
3234          auto focusedOnShow = info.want->GetBoolParam(AAFwk::Want::PARAM_RESV_WINDOW_FOCUSED, true);
3235          sceneSession->SetFocusedOnShow(focusedOnShow);
3236      } else {
3237          sceneSession->SetFocusedOnShow(true);
3238      }
3239  
3240      auto callerSession = SceneSessionManager::GetInstance().GetSceneSession(info.callerPersistentId_);
3241      if (callerSession != nullptr) {
3242          TLOGI(WmsLogTag::WMS_SCB,
3243              "update isCalledRightlyByCallerId from :%{public}d to false", info.isCalledRightlyByCallerId_);
3244          info.isCalledRightlyByCallerId_ = false;
3245      }
3246      std::shared_ptr<SessionInfo> sessionInfo = std::make_shared<SessionInfo>(info);
3247      auto task = [weakThis = wptr(this), sessionInfo] {
3248          auto jsSceneSession = weakThis.promote();
3249          if (jsSceneSession == nullptr) {
3250              TLOGE(WmsLogTag::WMS_LIFE, "PendingSessionActivation JsSceneSession is null");
3251              return;
3252          }
3253          jsSceneSession->PendingSessionActivationInner(sessionInfo);
3254      };
3255      sceneSession->PostLifeCycleTask(task, "PendingSessionActivation", LifeCycleTaskType::START);
3256      if (info.fullScreenStart_) {
3257          sceneSession->NotifySessionFullScreen(true);
3258      }
3259  }
3260  
PendingSessionActivationInner(std::shared_ptr<SessionInfo> sessionInfo)3261  void JsSceneSession::PendingSessionActivationInner(std::shared_ptr<SessionInfo> sessionInfo)
3262  {
3263      napi_env& env_ref = env_;
3264      auto task = [weakThis = wptr(this), persistentId = persistentId_, sessionInfo, env_ref] {
3265          auto jsSceneSession = weakThis.promote();
3266          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3267              TLOGE(WmsLogTag::WMS_LIFE, "PendingSessionActivationInner jsSceneSession id:%{public}d has been destroyed",
3268                  persistentId);
3269              return;
3270          }
3271          auto jsCallBack = jsSceneSession->GetJSCallback(PENDING_SCENE_CB);
3272          if (!jsCallBack) {
3273              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]jsCallBack is nullptr");
3274              return;
3275          }
3276          if (sessionInfo == nullptr) {
3277              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]sessionInfo is nullptr");
3278              return;
3279          }
3280          napi_value jsSessionInfo = CreateJsSessionInfo(env_ref, *sessionInfo);
3281          if (jsSessionInfo == nullptr) {
3282              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]target session info is nullptr");
3283              return;
3284          }
3285          napi_value argv[] = {jsSessionInfo};
3286          TLOGI(WmsLogTag::WMS_LIFE, "[NAPI]PendingSessionActivationInner task success, id:%{public}d",
3287              sessionInfo->persistentId_);
3288          napi_call_function(env_ref, NapiGetUndefined(env_ref),
3289              jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3290      };
3291      taskScheduler_->PostMainThreadTask(task, "PendingSessionActivationInner");
3292  }
3293  
OnBackPressed(bool needMoveToBackground)3294  void JsSceneSession::OnBackPressed(bool needMoveToBackground)
3295  {
3296      WLOGFI("[NAPI]OnBackPressed needMoveToBackground %{public}d", needMoveToBackground);
3297  
3298      auto task = [weakThis = wptr(this), persistentId = persistentId_, needMoveToBackground, env = env_] {
3299          auto jsSceneSession = weakThis.promote();
3300          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3301              TLOGE(WmsLogTag::WMS_LIFE, "OnBackPressed jsSceneSession id:%{public}d has been destroyed",
3302                  persistentId);
3303              return;
3304          }
3305          auto jsCallBack = jsSceneSession->GetJSCallback(BACK_PRESSED_CB);
3306          if (!jsCallBack) {
3307              WLOGFE("[NAPI]jsCallBack is nullptr");
3308              return;
3309          }
3310          napi_value jsNeedMoveToBackgroundObj = CreateJsValue(env, needMoveToBackground);
3311          napi_value argv[] = {jsNeedMoveToBackgroundObj};
3312          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3313      };
3314      taskScheduler_->PostMainThreadTask(task, "OnBackPressed:" + std::to_string(needMoveToBackground));
3315  }
3316  
TerminateSession(const SessionInfo & info)3317  void JsSceneSession::TerminateSession(const SessionInfo& info)
3318  {
3319      TLOGI(WmsLogTag::WMS_LIFE, "bundle:%{public}s, ability:%{public}s, id:%{public}d",
3320          info.bundleName_.c_str(), info.abilityName_.c_str(), info.persistentId_);
3321  
3322      std::shared_ptr<SessionInfo> sessionInfo = std::make_shared<SessionInfo>(info);
3323      auto task = [weakThis = wptr(this), persistentId = persistentId_, sessionInfo, env = env_] {
3324          auto jsSceneSession = weakThis.promote();
3325          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3326              TLOGE(WmsLogTag::WMS_LIFE, "TerminateSession jsSceneSession id:%{public}d has been destroyed",
3327                  persistentId);
3328              return;
3329          }
3330          auto jsCallBack = jsSceneSession->GetJSCallback(TERMINATE_SESSION_CB);
3331          if (!jsCallBack) {
3332              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]jsCallBack is nullptr");
3333              return;
3334          }
3335          if (sessionInfo == nullptr) {
3336              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]sessionInfo is nullptr");
3337              return;
3338          }
3339          napi_value jsSessionInfo = CreateJsSessionInfo(env, *sessionInfo);
3340          if (jsSessionInfo == nullptr) {
3341              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]target session info is nullptr");
3342              return;
3343          }
3344          napi_value argv[] = {jsSessionInfo};
3345          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3346      };
3347      taskScheduler_->PostMainThreadTask(task, "TerminateSession name:" + info.abilityName_);
3348  }
3349  
TerminateSessionNew(const SessionInfo & info,bool needStartCaller,bool isFromBroker)3350  void JsSceneSession::TerminateSessionNew(const SessionInfo& info, bool needStartCaller, bool isFromBroker)
3351  {
3352      TLOGI(WmsLogTag::WMS_LIFE, "[NAPI]bundleName = %{public}s, abilityName = %{public}s",
3353          info.bundleName_.c_str(), info.abilityName_.c_str());
3354      bool needRemoveSession = false;
3355      if (!needStartCaller && !isFromBroker) {
3356          needRemoveSession = true;
3357      }
3358      auto task = [weakThis = wptr(this), persistentId = persistentId_, needStartCaller, needRemoveSession, env = env_] {
3359          auto jsSceneSession = weakThis.promote();
3360          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3361              TLOGE(WmsLogTag::WMS_LIFE, "TerminateSessionNew jsSceneSession id:%{public}d has been destroyed",
3362                  persistentId);
3363              return;
3364          }
3365          auto jsCallBack = jsSceneSession->GetJSCallback(TERMINATE_SESSION_CB_NEW);
3366          if (!jsCallBack) {
3367              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]jsCallBack is nullptr");
3368              return;
3369          }
3370          napi_value jsNeedStartCaller = CreateJsValue(env, needStartCaller);
3371          if (jsNeedStartCaller == nullptr) {
3372              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]jsNeedStartCaller is nullptr");
3373              return;
3374          }
3375          napi_value jsNeedRemoveSession = CreateJsValue(env, needRemoveSession);
3376          if (jsNeedRemoveSession == nullptr) {
3377              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]jsNeedRemoveSession is nullptr");
3378              return;
3379          }
3380          napi_value argv[] = {jsNeedStartCaller, jsNeedRemoveSession};
3381          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3382      };
3383      taskScheduler_->PostMainThreadTask(task, "TerminateSessionNew, name:" + info.abilityName_);
3384  }
3385  
TerminateSessionTotal(const SessionInfo & info,TerminateType terminateType)3386  void JsSceneSession::TerminateSessionTotal(const SessionInfo& info, TerminateType terminateType)
3387  {
3388      TLOGI(WmsLogTag::WMS_LIFE, "[NAPI]bundleName = %{public}s, abilityName = %{public}s, terminateType = %{public}d",
3389          info.bundleName_.c_str(), info.abilityName_.c_str(), static_cast<int32_t>(terminateType));
3390  
3391      auto task = [weakThis = wptr(this), persistentId = persistentId_, terminateType, env = env_] {
3392          auto jsSceneSession = weakThis.promote();
3393          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3394              TLOGE(WmsLogTag::WMS_LIFE, "TerminateSessionTotal jsSceneSession id:%{public}d has been destroyed",
3395                  persistentId);
3396              return;
3397          }
3398          auto jsCallBack = jsSceneSession->GetJSCallback(TERMINATE_SESSION_CB_TOTAL);
3399          if (!jsCallBack) {
3400              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]jsCallBack is nullptr");
3401              return;
3402          }
3403          napi_value jsTerminateType = CreateJsValue(env, static_cast<int32_t>(terminateType));
3404          if (jsTerminateType == nullptr) {
3405              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]jsTerminateType is nullptr");
3406              return;
3407          }
3408          napi_value argv[] = {jsTerminateType};
3409          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3410      };
3411      taskScheduler_->PostMainThreadTask(task, "TerminateSessionTotal:name:" + info.abilityName_);
3412  }
3413  
UpdateSessionLabel(const std::string & label)3414  void JsSceneSession::UpdateSessionLabel(const std::string& label)
3415  {
3416      WLOGFI("[NAPI]run UpdateSessionLabel");
3417  
3418      auto task = [weakThis = wptr(this), persistentId = persistentId_, label, env = env_] {
3419          auto jsSceneSession = weakThis.promote();
3420          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3421              TLOGE(WmsLogTag::WMS_LIFE, "UpdateSessionLabel jsSceneSession id:%{public}d has been destroyed",
3422                  persistentId);
3423              return;
3424          }
3425          auto jsCallBack = jsSceneSession->GetJSCallback(UPDATE_SESSION_LABEL_CB);
3426          if (!jsCallBack) {
3427              WLOGFE("[NAPI]jsCallBack is nullptr");
3428              return;
3429          }
3430          napi_value jsLabel = CreateJsValue(env, label);
3431          if (jsLabel == nullptr) {
3432              WLOGFE("[NAPI]this target jsLabel is nullptr");
3433              return;
3434          }
3435          napi_value argv[] = {jsLabel};
3436          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3437      };
3438      taskScheduler_->PostMainThreadTask(task, "UpdateSessionLabel");
3439  }
3440  
ProcessUpdateSessionLabelRegister()3441  void JsSceneSession::ProcessUpdateSessionLabelRegister()
3442  {
3443      WLOGFD("begin to run ProcessUpdateSessionLabelRegister");
3444      NofitySessionLabelUpdatedFunc func = [weakThis = wptr(this)](const std::string& label) {
3445          auto jsSceneSession = weakThis.promote();
3446          if (!jsSceneSession) {
3447              TLOGE(WmsLogTag::WMS_LIFE, "ProcessUpdateSessionLabelRegister jsSceneSession is null");
3448              return;
3449          }
3450          jsSceneSession->UpdateSessionLabel(label);
3451      };
3452      auto session = weakSession_.promote();
3453      if (session == nullptr) {
3454          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
3455          return;
3456      }
3457      session->SetUpdateSessionLabelListener(func);
3458      WLOGFD("ProcessUpdateSessionLabelRegister success");
3459  }
3460  
ProcessUpdateSessionIconRegister()3461  void JsSceneSession::ProcessUpdateSessionIconRegister()
3462  {
3463      WLOGFD("begin to run ProcessUpdateSessionIconRegister");
3464      NofitySessionIconUpdatedFunc func = [weakThis = wptr(this)](const std::string& iconPath) {
3465          auto jsSceneSession = weakThis.promote();
3466          if (!jsSceneSession) {
3467              TLOGE(WmsLogTag::WMS_LIFE, "ProcessUpdateSessionIconRegister jsSceneSession is null");
3468              return;
3469          }
3470          jsSceneSession->UpdateSessionIcon(iconPath);
3471      };
3472      auto session = weakSession_.promote();
3473      if (session == nullptr) {
3474          WLOGFE("session is nullptr, id:%{public}d", persistentId_);
3475          return;
3476      }
3477      session->SetUpdateSessionIconListener(func);
3478      WLOGFD("ProcessUpdateSessionIconRegister success");
3479  }
3480  
UpdateSessionIcon(const std::string & iconPath)3481  void JsSceneSession::UpdateSessionIcon(const std::string& iconPath)
3482  {
3483      WLOGFI("[NAPI]run UpdateSessionIcon");
3484  
3485      auto task = [weakThis = wptr(this), persistentId = persistentId_, iconPath, env = env_] {
3486          auto jsSceneSession = weakThis.promote();
3487          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3488              TLOGE(WmsLogTag::WMS_LIFE, "UpdateSessionIcon jsSceneSession id:%{public}d has been destroyed",
3489                  persistentId);
3490              return;
3491          }
3492          auto jsCallBack = jsSceneSession->GetJSCallback(UPDATE_SESSION_ICON_CB);
3493          if (!jsCallBack) {
3494              WLOGFE("[NAPI]jsCallBack is nullptr");
3495              return;
3496          }
3497          napi_value jsIconPath = CreateJsValue(env, iconPath);
3498          if (jsIconPath == nullptr) {
3499              WLOGFE("[NAPI]this target jsIconPath is nullptr");
3500              return;
3501          }
3502          napi_value argv[] = {jsIconPath};
3503          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3504      };
3505      taskScheduler_->PostMainThreadTask(task, "UpdateSessionIcon");
3506  }
3507  
OnSessionException(const SessionInfo & info,bool needRemoveSession,bool startFail)3508  void JsSceneSession::OnSessionException(const SessionInfo& info, bool needRemoveSession, bool startFail)
3509  {
3510      TLOGI(WmsLogTag::WMS_LIFE, "[NAPI]bundleName = %{public}s, abilityName = %{public}s, startFail = %{public}d",
3511          info.bundleName_.c_str(), info.abilityName_.c_str(), startFail);
3512  
3513      std::shared_ptr<SessionInfo> sessionInfo = std::make_shared<SessionInfo>(info);
3514      auto task = [weakThis = wptr(this), persistentId = persistentId_,
3515          sessionInfo, needRemoveSession, startFail, env = env_] {
3516          auto jsSceneSession = weakThis.promote();
3517          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3518              TLOGE(WmsLogTag::WMS_LIFE, "OnSessionException jsSceneSession id:%{public}d has been destroyed",
3519                  persistentId);
3520              return;
3521          }
3522          auto jsCallBack = jsSceneSession->GetJSCallback(SESSION_EXCEPTION_CB);
3523          if (!jsCallBack) {
3524              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]jsCallBack is nullptr");
3525              return;
3526          }
3527          if (sessionInfo == nullptr) {
3528              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]sessionInfo is nullptr");
3529              return;
3530          }
3531          napi_value jsSessionInfo = CreateJsSessionInfo(env, *sessionInfo);
3532          napi_value jsNeedRemoveSession = CreateJsValue(env, needRemoveSession);
3533          napi_value jsStartFail = CreateJsValue(env, startFail);
3534          if (jsSessionInfo == nullptr) {
3535              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]target session info is nullptr");
3536              return;
3537          }
3538          napi_value argv[] = {jsSessionInfo, jsNeedRemoveSession, jsStartFail};
3539          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3540      };
3541      taskScheduler_->PostMainThreadTask(task, "OnSessionException, name" + info.bundleName_);
3542  }
3543  
PendingSessionToForeground(const SessionInfo & info)3544  void JsSceneSession::PendingSessionToForeground(const SessionInfo& info)
3545  {
3546      TLOGI(WmsLogTag::WMS_LIFE, "[NAPI]bundleName = %{public}s, abilityName = %{public}s",
3547          info.bundleName_.c_str(), info.abilityName_.c_str());
3548  
3549      std::shared_ptr<SessionInfo> sessionInfo = std::make_shared<SessionInfo>(info);
3550      auto task = [weakThis = wptr(this), persistentId = persistentId_, sessionInfo, env = env_] {
3551          auto jsSceneSession = weakThis.promote();
3552          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3553              TLOGE(WmsLogTag::WMS_LIFE, "PendingSessionToForeground jsSceneSession id:%{public}d has been destroyed",
3554                  persistentId);
3555              return;
3556          }
3557          auto jsCallBack = jsSceneSession->GetJSCallback(PENDING_SESSION_TO_FOREGROUND_CB);
3558          if (!jsCallBack) {
3559              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]jsCallBack is nullptr");
3560              return;
3561          }
3562          if (sessionInfo == nullptr) {
3563              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]sessionInfo is nullptr");
3564              return;
3565          }
3566          napi_value jsSessionInfo = CreateJsSessionInfo(env, *sessionInfo);
3567          if (jsSessionInfo == nullptr) {
3568              TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]target session info is nullptr");
3569              return;
3570          }
3571          napi_value argv[] = {jsSessionInfo};
3572          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3573      };
3574      taskScheduler_->PostMainThreadTask(task, "PendingSessionToForeground:" + info.bundleName_);
3575  }
3576  
PendingSessionToBackgroundForDelegator(const SessionInfo & info,bool shouldBackToCaller)3577  void JsSceneSession::PendingSessionToBackgroundForDelegator(const SessionInfo& info, bool shouldBackToCaller)
3578  {
3579      TLOGI(WmsLogTag::WMS_LIFE,
3580          "[NAPI]bundleName = %{public}s, abilityName = %{public}s, shouldBackToCaller = %{public}d",
3581          info.bundleName_.c_str(), info.abilityName_.c_str(), shouldBackToCaller);
3582  
3583      std::shared_ptr<SessionInfo> sessionInfo = std::make_shared<SessionInfo>(info);
3584      auto task = [weakThis = wptr(this), persistentId = persistentId_, sessionInfo, env = env_, shouldBackToCaller] {
3585          auto jsSceneSession = weakThis.promote();
3586          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3587              TLOGNE(WmsLogTag::WMS_LIFE, "jsSceneSession id:%{public}d has been destroyed", persistentId);
3588              return;
3589          }
3590          auto jsCallBack = jsSceneSession->GetJSCallback(PENDING_SESSION_TO_BACKGROUND_FOR_DELEGATOR_CB);
3591          if (!jsCallBack) {
3592              TLOGNE(WmsLogTag::WMS_LIFE, "[NAPI]jsCallBack is nullptr");
3593              return;
3594          }
3595          napi_value jsSessionInfo = CreateJsSessionInfo(env, *sessionInfo);
3596          napi_value jsShouldBackToCaller = CreateJsValue(env, shouldBackToCaller);
3597          if (jsSessionInfo == nullptr) {
3598              TLOGNE(WmsLogTag::WMS_LIFE, "[NAPI]target session info is nullptr");
3599              return;
3600          }
3601          napi_value argv[] = {jsSessionInfo, jsShouldBackToCaller};
3602          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3603      };
3604      taskScheduler_->PostMainThreadTask(task, "PendingSessionToBackgroundForDelegator, name:" + info.bundleName_);
3605  }
3606  
OnSystemBarPropertyChange(const std::unordered_map<WindowType,SystemBarProperty> & propertyMap)3607  void JsSceneSession::OnSystemBarPropertyChange(const std::unordered_map<WindowType, SystemBarProperty>& propertyMap)
3608  {
3609      TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]OnSystemBarPropertyChange");
3610  
3611      auto task = [weakThis = wptr(this), persistentId = persistentId_, propertyMap, env = env_] {
3612          auto jsSceneSession = weakThis.promote();
3613          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3614              TLOGE(WmsLogTag::WMS_LIFE, "OnSystemBarPropertyChange jsSceneSession id:%{public}d has been destroyed",
3615                  persistentId);
3616              return;
3617          }
3618          auto jsCallBack = jsSceneSession->GetJSCallback(SYSTEMBAR_PROPERTY_CHANGE_CB);
3619          if (jsCallBack == nullptr) {
3620              WLOGFE("[NAPI]jsCallBack is nullptr");
3621              return;
3622          }
3623          napi_value jsSessionStateObj = CreateJsSystemBarPropertyArrayObject(env, propertyMap);
3624          if (jsSessionStateObj == nullptr) {
3625              TLOGE(WmsLogTag::WMS_IMMS, "[NAPI]jsSessionStateObj is nullptr");
3626              return;
3627          }
3628          napi_value argv[] = {jsSessionStateObj};
3629          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3630      };
3631      taskScheduler_->PostMainThreadTask(task, "OnSystemBarPropertyChange");
3632  }
3633  
OnNeedAvoid(bool status)3634  void JsSceneSession::OnNeedAvoid(bool status)
3635  {
3636      TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]OnNeedAvoid %{public}d", status);
3637  
3638      auto task = [weakThis = wptr(this), persistentId = persistentId_, needAvoid = status, env = env_] {
3639          auto jsSceneSession = weakThis.promote();
3640          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3641              TLOGE(WmsLogTag::WMS_LIFE, "OnNeedAvoid jsSceneSession id:%{public}d has been destroyed",
3642                  persistentId);
3643              return;
3644          }
3645          auto jsCallBack = jsSceneSession->GetJSCallback(NEED_AVOID_CB);
3646          if (jsCallBack == nullptr) {
3647              WLOGFE("[NAPI]jsCallBack is nullptr");
3648              return;
3649          }
3650          napi_value jsSessionStateObj = CreateJsValue(env, needAvoid);
3651          napi_value argv[] = {jsSessionStateObj};
3652          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3653      };
3654      taskScheduler_->PostMainThreadTask(task, "OnNeedAvoid:" + std::to_string(status));
3655  }
3656  
OnIsCustomAnimationPlaying(bool status)3657  void JsSceneSession::OnIsCustomAnimationPlaying(bool status)
3658  {
3659      WLOGFI("[NAPI]OnIsCustomAnimationPlaying %{public}d", status);
3660  
3661      auto task = [weakThis = wptr(this), persistentId = persistentId_, isPlaying = status, env = env_] {
3662          auto jsSceneSession = weakThis.promote();
3663          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3664              TLOGE(WmsLogTag::WMS_LIFE, "OnIsCustomAnimationPlaying jsSceneSession id:%{public}d has been destroyed",
3665                  persistentId);
3666              return;
3667          }
3668          auto jsCallBack = jsSceneSession->GetJSCallback(CUSTOM_ANIMATION_PLAYING_CB);
3669          if (jsCallBack == nullptr) {
3670              WLOGFE("[NAPI]jsCallBack is nullptr");
3671              return;
3672          }
3673          napi_value jsSessionStateObj = CreateJsValue(env, isPlaying);
3674          napi_value argv[] = {jsSessionStateObj};
3675          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3676      };
3677      taskScheduler_->PostMainThreadTask(task, "OnIsCustomAnimationPlaying:" + std::to_string(status));
3678  }
3679  
OnShowWhenLocked(bool showWhenLocked)3680  void JsSceneSession::OnShowWhenLocked(bool showWhenLocked)
3681  {
3682      WLOGFI("[NAPI]OnShowWhenLocked %{public}d", showWhenLocked);
3683  
3684      auto task = [weakThis = wptr(this), persistentId = persistentId_, flag = showWhenLocked, env = env_] {
3685          auto jsSceneSession = weakThis.promote();
3686          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3687              TLOGE(WmsLogTag::WMS_LIFE, "OnShowWhenLocked jsSceneSession id:%{public}d has been destroyed",
3688                  persistentId);
3689              return;
3690          }
3691          auto jsCallBack = jsSceneSession->GetJSCallback(SHOW_WHEN_LOCKED_CB);
3692          if (jsCallBack == nullptr) {
3693              WLOGFE("[NAPI]jsCallBack is nullptr");
3694              return;
3695          }
3696          napi_value jsSessionStateObj = CreateJsValue(env, flag);
3697          napi_value argv[] = {jsSessionStateObj};
3698          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3699      };
3700      taskScheduler_->PostMainThreadTask(task, "OnShowWhenLocked:" +std::to_string(showWhenLocked));
3701  }
3702  
OnReuqestedOrientationChange(uint32_t orientation)3703  void JsSceneSession::OnReuqestedOrientationChange(uint32_t orientation)
3704  {
3705      WLOGFI("[NAPI]OnReuqestedOrientationChange %{public}u", orientation);
3706  
3707      auto task = [weakThis = wptr(this), persistentId = persistentId_, rotation = orientation, env = env_] {
3708          auto jsSceneSession = weakThis.promote();
3709          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3710              TLOGE(WmsLogTag::WMS_LIFE, "OnReuqestedOrientationChange jsSceneSession id:%{public}d has been destroyed",
3711                  persistentId);
3712              return;
3713          }
3714          auto jsCallBack = jsSceneSession->GetJSCallback(REQUESTED_ORIENTATION_CHANGE_CB);
3715          if (jsCallBack == nullptr) {
3716              WLOGFE("[NAPI]jsCallBack is nullptr");
3717              return;
3718          }
3719          napi_value jsSessionRotationObj = CreateJsValue(env, rotation);
3720          napi_value argv[] = {jsSessionRotationObj};
3721          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
3722          WLOGFI("[NAPI]change rotation success %{public}u", rotation);
3723      };
3724      taskScheduler_->PostMainThreadTask(task, "OnReuqestedOrientationChange:orientation" +std::to_string(orientation));
3725  }
3726  
OnSetShowRecent(napi_env env,napi_callback_info info)3727  napi_value JsSceneSession::OnSetShowRecent(napi_env env, napi_callback_info info)
3728  {
3729      auto session = weakSession_.promote();
3730      if (session == nullptr) {
3731          WLOGFE("[NAPI]session is null, id:%{public}d", persistentId_);
3732          return NapiGetUndefined(env);
3733      }
3734      size_t argc = 4;
3735      napi_value argv[4] = {nullptr};
3736      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3737      bool showRecent = true;
3738      if (argc == ARGC_ONE && GetType(env, argv[0]) == napi_boolean) {
3739          if (!ConvertFromJsValue(env, argv[0], showRecent)) {
3740              WLOGFE("[NAPI]Failed to convert parameter to bool");
3741              return NapiGetUndefined(env);
3742          }
3743      }
3744      session->SetShowRecent(showRecent);
3745      return NapiGetUndefined(env);
3746  }
3747  
OnSetZOrder(napi_env env,napi_callback_info info)3748  napi_value JsSceneSession::OnSetZOrder(napi_env env, napi_callback_info info)
3749  {
3750      size_t argc = 4;
3751      napi_value argv[4] = {nullptr};
3752      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3753      if (argc != 1) { // 1: params num
3754          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
3755          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3756              "Input parameter is missing or invalid"));
3757          return NapiGetUndefined(env);
3758      }
3759      uint32_t zOrder;
3760      if (!ConvertFromJsValue(env, argv[0], zOrder)) {
3761          WLOGFE("[NAPI]Failed to convert parameter to uint32_t");
3762          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3763              "Input parameter is missing or invalid"));
3764          return NapiGetUndefined(env);
3765      }
3766      auto session = weakSession_.promote();
3767      if (session == nullptr) {
3768          WLOGFW("[NAPI]session is null, id:%{public}d", persistentId_);
3769          return NapiGetUndefined(env);
3770      }
3771      session->SetZOrder(zOrder);
3772      return NapiGetUndefined(env);
3773  }
3774  
OnSetFloatingScale(napi_env env,napi_callback_info info)3775  napi_value JsSceneSession::OnSetFloatingScale(napi_env env, napi_callback_info info)
3776  {
3777      size_t argc = 4;
3778      napi_value argv[4] = {nullptr};
3779      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3780      if (argc < 1) { // 1: params num
3781          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
3782          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3783              "Input parameter is missing or invalid"));
3784          return NapiGetUndefined(env);
3785      }
3786      double_t floatingScale = 1.0;
3787      if (!ConvertFromJsValue(env, argv[0], floatingScale)) {
3788          WLOGFE("[NAPI]Failed to convert parameter to bool");
3789          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3790              "Input parameter is missing or invalid"));
3791          return NapiGetUndefined(env);
3792      }
3793      auto session = weakSession_.promote();
3794      if (session == nullptr) {
3795          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
3796          return NapiGetUndefined(env);
3797      }
3798      session->SetFloatingScale(static_cast<float_t>(floatingScale));
3799      return NapiGetUndefined(env);
3800  }
3801  
OnSetIsMidScene(napi_env env,napi_callback_info info)3802  napi_value JsSceneSession::OnSetIsMidScene(napi_env env, napi_callback_info info)
3803  {
3804      size_t argc = ARGC_FOUR;
3805      napi_value argv[ARGC_FOUR] = {nullptr};
3806      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3807      if (argc < ARGC_ONE) {
3808          TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "[NAPI]Argc is invalid: %{public}zu", argc);
3809          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3810              "Input parameter is missing or invalid"));
3811          return NapiGetUndefined(env);
3812      }
3813  
3814      bool isMidScene = false;
3815      if (!ConvertFromJsValue(env, argv[0], isMidScene)) {
3816          TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "[NAPI]Failed to convert parameter to isMidScene");
3817          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3818              "Input parameter is missing or invalid"));
3819          return NapiGetUndefined(env);
3820      }
3821  
3822      auto session = weakSession_.promote();
3823      if (session == nullptr) {
3824          TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
3825          return NapiGetUndefined(env);
3826      }
3827      session->SetIsMidScene(isMidScene);
3828      return NapiGetUndefined(env);
3829  }
3830  
OnSetSCBKeepKeyboard(napi_env env,napi_callback_info info)3831  napi_value JsSceneSession::OnSetSCBKeepKeyboard(napi_env env, napi_callback_info info)
3832  {
3833      size_t argc = 4;
3834      napi_value argv[4] = {nullptr};
3835      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3836      if (argc < 1) {
3837          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
3838          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3839              "Input parameter is missing or invalid"));
3840          return NapiGetUndefined(env);
3841      }
3842      bool scbKeepKeyboardFlag = false;
3843      if (!ConvertFromJsValue(env, argv[0], scbKeepKeyboardFlag)) {
3844          WLOGFE("[NAPI]Failed to convert parameter to bool");
3845          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3846              "Input parameter is missing or invalid"));
3847          return NapiGetUndefined(env);
3848      }
3849      auto session = weakSession_.promote();
3850      if (session == nullptr) {
3851          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
3852          return NapiGetUndefined(env);
3853      }
3854      session->SetSCBKeepKeyboard(scbKeepKeyboardFlag);
3855      return NapiGetUndefined(env);
3856  }
3857  
OnSetOffset(napi_env env,napi_callback_info info)3858  napi_value JsSceneSession::OnSetOffset(napi_env env, napi_callback_info info)
3859  {
3860      size_t argc = 4;
3861      napi_value argv[4] = {nullptr};
3862      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3863      if (argc != 2) {
3864          WLOGFE("[NAPI]Argc count is invalid: %{public}zu", argc);
3865          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3866                                        "Input parameter is missing or invalid"));
3867          return NapiGetUndefined(env);
3868      }
3869  
3870      double offsetX = 0.0f;
3871      if (!ConvertFromJsValue(env, argv[0], offsetX)) {
3872          WLOGFE("[NAPI]Failed to convert parameter to double");
3873          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3874                                        "Input parameter is missing or invalid"));
3875          return NapiGetUndefined(env);
3876      }
3877  
3878      double offsetY = 0.0f;
3879      if (!ConvertFromJsValue(env, argv[1], offsetY)) {
3880          WLOGFE("[NAPI]Failed to convert parameter to double");
3881          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3882                                        "Input parameter is missing or invalid"));
3883          return NapiGetUndefined(env);
3884      }
3885  
3886      auto session = weakSession_.promote();
3887      if (session == nullptr) {
3888          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
3889          return NapiGetUndefined(env);
3890      }
3891      session->SetOffset(static_cast<float>(offsetX), static_cast<float>(offsetY));
3892      return NapiGetUndefined(env);
3893  }
3894  
OnSetExitSplitOnBackground(napi_env env,napi_callback_info info)3895  napi_value JsSceneSession::OnSetExitSplitOnBackground(napi_env env, napi_callback_info info)
3896  {
3897      size_t argc = ARGC_FOUR;
3898      napi_value argv[ARGC_FOUR] = {nullptr};
3899      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3900      if (argc != 1) {
3901          TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "[NAPI]Argc count is invalid: %{public}zu", argc);
3902          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3903                                        "Input parameter is missing or invalid"));
3904          return NapiGetUndefined(env);
3905      }
3906  
3907      bool isExitSplitOnBackground = false;
3908      if (!ConvertFromJsValue(env, argv[0], isExitSplitOnBackground)) {
3909          TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "[NAPI]Failed to convert parameter to bool");
3910          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3911                                        "Input parameter is missing or invalid"));
3912          return NapiGetUndefined(env);
3913      }
3914  
3915      auto session = weakSession_.promote();
3916      if (session == nullptr) {
3917          TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
3918          return NapiGetUndefined(env);
3919      }
3920      session->SetExitSplitOnBackground(isExitSplitOnBackground);
3921      return NapiGetUndefined(env);
3922  }
3923  
OnSetWaterMarkFlag(napi_env env,napi_callback_info info)3924  napi_value JsSceneSession::OnSetWaterMarkFlag(napi_env env, napi_callback_info info)
3925  {
3926      size_t argc = ARGC_FOUR;
3927      napi_value argv[ARGC_FOUR] = {nullptr};
3928      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3929      if (argc < ARGC_ONE) {
3930          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
3931          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3932              "Input parameter is missing or invalid"));
3933          return NapiGetUndefined(env);
3934      }
3935  
3936      bool isWaterMarkAdded = false;
3937      if (!ConvertFromJsValue(env, argv[0], isWaterMarkAdded)) {
3938          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to bool");
3939          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3940              "Input parameter is missing or invalid"));
3941          return NapiGetUndefined(env);
3942      }
3943  
3944      auto session = weakSession_.promote();
3945      if (session == nullptr) {
3946          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
3947          return NapiGetUndefined(env);
3948      }
3949  
3950      sptr<WindowSessionProperty> property = new WindowSessionProperty();
3951      if (property == nullptr) {
3952          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]property is nullptr");
3953          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
3954              "Input parameter is missing or invalid"));
3955          return NapiGetUndefined(env);
3956      }
3957  
3958      uint32_t currFlag = session->GetSessionProperty()->GetWindowFlags();
3959      if (isWaterMarkAdded) {
3960          currFlag = currFlag | static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_WATER_MARK);
3961      } else {
3962          currFlag = currFlag & ~(static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_WATER_MARK));
3963      }
3964      property->SetSystemCalling(true);
3965      property->SetWindowFlags(currFlag);
3966      SceneSessionManager::GetInstance().SetWindowFlags(session, property);
3967      return NapiGetUndefined(env);
3968  }
3969  
ProcessPrepareClosePiPSessionRegister()3970  void JsSceneSession::ProcessPrepareClosePiPSessionRegister()
3971  {
3972      auto session = weakSession_.promote();
3973      if (session == nullptr) {
3974          TLOGE(WmsLogTag::WMS_PIP, "session is nullptr, id:%{public}d", persistentId_);
3975          return;
3976      }
3977      session->RegisterProcessPrepareClosePiPCallback([weakThis = wptr(this)] {
3978          auto jsSceneSession = weakThis.promote();
3979          if (!jsSceneSession) {
3980              TLOGNE(WmsLogTag::WMS_LIFE, "OnPrepareClosePiPSession jsSceneSession is null");
3981              return;
3982          }
3983          jsSceneSession->OnPrepareClosePiPSession();
3984      });
3985      TLOGD(WmsLogTag::WMS_PIP, "success");
3986  }
3987  
OnPrepareClosePiPSession()3988  void JsSceneSession::OnPrepareClosePiPSession()
3989  {
3990      TLOGI(WmsLogTag::WMS_PIP, "[NAPI]OnPrepareClosePiPSession");
3991      auto task = [weakThis = wptr(this), persistentId = persistentId_, env = env_] {
3992          auto jsSceneSession = weakThis.promote();
3993          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
3994              TLOGE(WmsLogTag::WMS_LIFE, "OnPrepareClosePiPSession jsSceneSession id:%{public}d has been destroyed",
3995                  persistentId);
3996              return;
3997          }
3998          auto jsCallBack = jsSceneSession->GetJSCallback(PREPARE_CLOSE_PIP_SESSION);
3999          if (!jsCallBack) {
4000              TLOGE(WmsLogTag::WMS_PIP, "[NAPI]jsCallBack is nullptr");
4001              return;
4002          }
4003          napi_value argv[] = {};
4004          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), 0, argv, nullptr);
4005      };
4006      taskScheduler_->PostMainThreadTask(task, "OnPrepareClosePiPSession");
4007  }
4008  
OnSetSystemActive(napi_env env,napi_callback_info info)4009  napi_value JsSceneSession::OnSetSystemActive(napi_env env, napi_callback_info info)
4010  {
4011      size_t argc = 4;
4012      napi_value argv[4] = { nullptr };
4013      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4014      if (argc < 1) {
4015         WLOGFE("[NAPI]argc is invalid : %{public}zu", argc);
4016         napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4017         "Input parameter is missing or invalid"));
4018         return NapiGetUndefined(env);
4019      }
4020      bool scbSystemActive = false;
4021      if (!ConvertFromJsValue(env, argv[0], scbSystemActive)){
4022          WLOGFE("[NAPI] Failed to convert parameter to bool");
4023          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4024          "Input parameter is missing or invalid"));
4025          return NapiGetUndefined(env);
4026      }
4027      auto session = weakSession_.promote();
4028      if (session == nullptr) {
4029          WLOGFE("[NAPI] session is null, id:%{public}d", persistentId_);
4030          return NapiGetUndefined(env);
4031      }
4032      session->SetSystemActive(scbSystemActive);
4033      return NapiGetUndefined(env);
4034  }
4035  
OnSetTouchable(napi_env env,napi_callback_info info)4036  napi_value JsSceneSession::OnSetTouchable(napi_env env, napi_callback_info info)
4037  {
4038      size_t argc = 4;
4039      napi_value argv[4] = { nullptr };
4040      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4041      if (argc != 1) {
4042          WLOGFE("[NAPI] Argc is invalid: %{public}zu", argc);
4043          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4044              "Input Parameter is missing or invalid" ));
4045          return NapiGetUndefined(env);
4046      }
4047  
4048      bool touchable = false;
4049      if (!ConvertFromJsValue(env, argv[0], touchable)) {
4050        WLOGFE("[NAPI] Failed to  convert parameter to touchable");
4051        napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4052          "Input parameter is missing or invalid" ));
4053        return NapiGetUndefined(env);
4054      }
4055  
4056      auto session = weakSession_.promote();
4057      if (session == nullptr) {
4058          WLOGFE("[NAPI] session is null, id:%{public}d", persistentId_);
4059          return NapiGetUndefined(env);
4060      }
4061  
4062      session->SetSystemTouchable(touchable);
4063      return NapiGetUndefined(env);
4064  }
4065  
SetScale(napi_env env,napi_callback_info info)4066  napi_value JsSceneSession::SetScale(napi_env env, napi_callback_info info)
4067  {
4068      if (Session::IsScbCoreEnabled()) {
4069          return nullptr;
4070      }
4071      WLOGI("[NAPI]SetScale");
4072      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
4073      return (me != nullptr) ? me->OnSetScale(env, info) : nullptr;
4074  }
4075  
OnSetScale(napi_env env,napi_callback_info info)4076  napi_value JsSceneSession::OnSetScale(napi_env env, napi_callback_info info)
4077  {
4078      size_t argc = ARG_COUNT_4;
4079      napi_value argv[ARG_COUNT_4] = {nullptr};
4080      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4081      if (argc < ARG_COUNT_4) { // ARG_COUNT_4: params num
4082          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
4083          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4084              "Input parameter is missing or invalid"));
4085          return NapiGetUndefined(env);
4086      }
4087      double_t scaleX = 1.0;
4088      if (!ConvertFromJsValue(env, argv[ARG_INDEX_0], scaleX)) {
4089          WLOGFE("[NAPI]Failed to convert parameter to scaleX");
4090          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4091              "Input parameter is missing or invalid"));
4092          return NapiGetUndefined(env);
4093      }
4094      double_t scaleY = 1.0;
4095      if (!ConvertFromJsValue(env, argv[ARG_INDEX_1], scaleY)) {
4096          WLOGFE("[NAPI]Failed to convert parameter to scaleY");
4097          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4098              "Input parameter is missing or invalid"));
4099          return NapiGetUndefined(env);
4100      }
4101      double_t pivotX = 0.0;
4102      if (!ConvertFromJsValue(env, argv[ARG_INDEX_2], pivotX)) {
4103          WLOGFE("[NAPI]Failed to convert parameter to pivotX");
4104          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4105              "Input parameter is missing or invalid"));
4106          return NapiGetUndefined(env);
4107      }
4108      double_t pivotY = 0.0;
4109      if (!ConvertFromJsValue(env, argv[ARG_INDEX_3], pivotY)) {
4110          WLOGFE("[NAPI]Failed to convert parameter to pivotY");
4111          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4112              "Input parameter is missing or invalid"));
4113          return NapiGetUndefined(env);
4114      }
4115      auto session = weakSession_.promote();
4116      if (session == nullptr) {
4117          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
4118          return NapiGetUndefined(env);
4119      }
4120      session->SetScale(static_cast<float_t>(scaleX), static_cast<float_t>(scaleY), static_cast<float_t>(pivotX),
4121          static_cast<float_t>(pivotY));
4122      return NapiGetUndefined(env);
4123  }
4124  
SetWindowLastSafeRect(napi_env env,napi_callback_info info)4125  napi_value JsSceneSession::SetWindowLastSafeRect(napi_env env, napi_callback_info info)
4126  {
4127      TLOGI(WmsLogTag::WMS_LAYOUT, "[NAPI]");
4128      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
4129      return (me != nullptr) ? me->OnSetWindowLastSafeRect(env, info) : nullptr;
4130  }
4131  
OnSetWindowLastSafeRect(napi_env env,napi_callback_info info)4132  napi_value JsSceneSession::OnSetWindowLastSafeRect(napi_env env, napi_callback_info info)
4133  {
4134      size_t argc = ARG_COUNT_4;
4135      napi_value argv[ARG_COUNT_4] = {nullptr};
4136      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4137      if (argc < ARG_COUNT_4) {
4138          TLOGE(WmsLogTag::WMS_LAYOUT, "[NAPI]Argc is invalid: %{public}zu", argc);
4139          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4140              "Input parameter is missing or invalid"));
4141          return NapiGetUndefined(env);
4142      }
4143      int32_t left = 0;
4144      if (!ConvertFromJsValue(env, argv[ARG_INDEX_0], left)) {
4145          TLOGE(WmsLogTag::WMS_LAYOUT, "[NAPI]Failed to convert parameter to left");
4146          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4147              "Input parameter is missing or invalid"));
4148          return NapiGetUndefined(env);
4149      }
4150      int32_t top = 0;
4151      if (!ConvertFromJsValue(env, argv[ARG_INDEX_1], top)) {
4152          TLOGE(WmsLogTag::WMS_LAYOUT, "[NAPI]Failed to convert parameter to top");
4153          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4154              "Input parameter is missing or invalid"));
4155          return NapiGetUndefined(env);
4156      }
4157      int32_t width = 0;
4158      if (!ConvertFromJsValue(env, argv[ARG_INDEX_2], width)) {
4159          TLOGE(WmsLogTag::WMS_LAYOUT, "[NAPI]Failed to convert parameter to width");
4160          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4161              "Input parameter is missing or invalid"));
4162          return NapiGetUndefined(env);
4163      }
4164      int32_t height = 0;
4165      if (!ConvertFromJsValue(env, argv[ARG_INDEX_3], height)) {
4166          TLOGE(WmsLogTag::WMS_LAYOUT, "[NAPI]Failed to convert parameter to height");
4167          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4168              "Input parameter is missing or invalid"));
4169          return NapiGetUndefined(env);
4170      }
4171      auto session = weakSession_.promote();
4172      if (session == nullptr) {
4173          TLOGE(WmsLogTag::WMS_LAYOUT, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4174          return NapiGetUndefined(env);
4175      }
4176      WSRect lastRect = { left, top, width, height };
4177      session->SetSessionRequestRect(lastRect);
4178      return NapiGetUndefined(env);
4179  }
4180  
RequestHideKeyboard(napi_env env,napi_callback_info info)4181  napi_value JsSceneSession::RequestHideKeyboard(napi_env env, napi_callback_info info)
4182  {
4183      WLOGI("[NAPI]RequestHideKeyboard");
4184      JsSceneSession* me = CheckParamsAndGetThis<JsSceneSession>(env, info);
4185      return (me != nullptr) ? me->OnRequestHideKeyboard(env, info) : nullptr;
4186  }
4187  
OnRequestHideKeyboard(napi_env env,napi_callback_info info)4188  napi_value JsSceneSession::OnRequestHideKeyboard(napi_env env, napi_callback_info info)
4189  {
4190      WLOGFI("[NAPI]OnRequestHideKeyboard");
4191      auto session = weakSession_.promote();
4192      if (session == nullptr) {
4193          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
4194          return NapiGetUndefined(env);
4195      }
4196      session->RequestHideKeyboard();
4197      return NapiGetUndefined(env);
4198  }
4199  
OnSetPipActionEvent(napi_env env,napi_callback_info info)4200  napi_value JsSceneSession::OnSetPipActionEvent(napi_env env, napi_callback_info info)
4201  {
4202      size_t argc = 4;
4203      napi_value argv[4] = {nullptr};
4204      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4205      if (argc < 1) {
4206          TLOGE(WmsLogTag::WMS_PIP, "[NAPI]Argc count is invalid: %{public}zu", argc);
4207          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4208                                        "Input parameter is missing or invalid"));
4209          return NapiGetUndefined(env);
4210      }
4211      std::string action;
4212      if (!ConvertFromJsValue(env, argv[0], action)) {
4213          TLOGE(WmsLogTag::WMS_PIP, "[NAPI]Failed to convert parameter to string");
4214          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4215                                        "Input parameter is missing or invalid"));
4216          return NapiGetUndefined(env);
4217      }
4218      int32_t status = -1;
4219      if (argc > 1) {
4220          if (!ConvertFromJsValue(env, argv[1], status)) {
4221              TLOGE(WmsLogTag::WMS_PIP, "[NAPI]Failed to convert parameter to int");
4222              napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4223                                            "Input parameter is missing or invalid"));
4224              return NapiGetUndefined(env);
4225          }
4226      }
4227  
4228      auto session = weakSession_.promote();
4229      if (session == nullptr) {
4230          TLOGE(WmsLogTag::WMS_PIP, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4231          return NapiGetUndefined(env);
4232      }
4233      session->SetPipActionEvent(action, status);
4234      return NapiGetUndefined(env);
4235  }
4236  
OnSetPiPControlEvent(napi_env env,napi_callback_info info)4237  napi_value JsSceneSession::OnSetPiPControlEvent(napi_env env, napi_callback_info info)
4238  {
4239      size_t argc = ARG_COUNT_4;
4240      napi_value argv[ARG_COUNT_4] = {nullptr};
4241      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4242      if (argc < 1) {
4243          TLOGE(WmsLogTag::WMS_PIP, "[NAPI]Argc count is invalid: %{public}zu", argc);
4244          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4245              "Input parameter is missing or invalid"));
4246          return NapiGetUndefined(env);
4247      }
4248      auto controlType = WsPiPControlType::VIDEO_PLAY_PAUSE;
4249      if (!ConvertFromJsValue(env, argv[0], controlType)) {
4250          TLOGE(WmsLogTag::WMS_PIP, "[NAPI]Failed to convert parameter to int");
4251          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4252              "Input parameter is missing or invalid"));
4253          return NapiGetUndefined(env);
4254      }
4255      auto status = WsPiPControlStatus::PLAY;
4256      if (argc > 1) {
4257          if (!ConvertFromJsValue(env, argv[1], status)) {
4258              TLOGE(WmsLogTag::WMS_PIP, "[NAPI]Failed to convert parameter to int");
4259              napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4260                  "Input parameter is missing or invalid"));
4261              return NapiGetUndefined(env);
4262          }
4263      }
4264  
4265      auto session = weakSession_.promote();
4266      if (session == nullptr) {
4267          TLOGE(WmsLogTag::WMS_PIP, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4268          return NapiGetUndefined(env);
4269      }
4270      session->SetPiPControlEvent(controlType, status);
4271      return NapiGetUndefined(env);
4272  }
4273  
OnNotifyPipOcclusionChange(napi_env env,napi_callback_info info)4274  napi_value JsSceneSession::OnNotifyPipOcclusionChange(napi_env env, napi_callback_info info)
4275  {
4276      size_t argc = ARG_COUNT_4;
4277      napi_value argv[ARG_COUNT_4] = {nullptr};
4278      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4279      if (argc < 1) {
4280          TLOGE(WmsLogTag::WMS_PIP, "[NAPI]Argc count is invalid: %{public}zu", argc);
4281          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4282              "Input parameter is missing or invalid"));
4283          return NapiGetUndefined(env);
4284      }
4285      bool occluded = false;
4286      if (!ConvertFromJsValue(env, argv[0], occluded)) {
4287          TLOGE(WmsLogTag::WMS_PIP, "[NAPI]Failed to convert parameter, keep default: false");
4288      }
4289      auto session = weakSession_.promote();
4290      if (session == nullptr) {
4291          TLOGE(WmsLogTag::WMS_PIP, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4292          return NapiGetUndefined(env);
4293      }
4294      TLOGI(WmsLogTag::WMS_PIP, "[NAPI]persistId:%{public}d, occluded:%{public}d", persistentId_, occluded);
4295      // Maybe expand with session visibility&state change
4296      SceneSessionManager::GetInstance().HandleKeepScreenOn(session, !occluded);
4297      return NapiGetUndefined(env);
4298  }
4299  
OnNotifyDisplayStatusBarTemporarily(napi_env env,napi_callback_info info)4300  napi_value JsSceneSession::OnNotifyDisplayStatusBarTemporarily(napi_env env, napi_callback_info info)
4301  {
4302      auto session = weakSession_.promote();
4303      if (session == nullptr) {
4304          TLOGE(WmsLogTag::WMS_IMMS, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4305          return NapiGetUndefined(env);
4306      }
4307      size_t argc = ARGC_FOUR;
4308      napi_value argv[ARGC_FOUR] = {nullptr};
4309      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4310      bool isTempDisplay = false;
4311      if (argc == ARGC_ONE && GetType(env, argv[0]) == napi_boolean) {
4312          if (!ConvertFromJsValue(env, argv[0], isTempDisplay)) {
4313              TLOGE(WmsLogTag::WMS_IMMS, "[NAPI]failed to convert parameter to bool");
4314              return NapiGetUndefined(env);
4315          }
4316      }
4317      session->SetIsDisplayStatusBarTemporarily(isTempDisplay);
4318  
4319      TLOGI(WmsLogTag::WMS_IMMS, "Set success with id:%{public}u name:%{public}s isTempDisplay:%{public}u",
4320          session->GetPersistentId(), session->GetWindowName().c_str(), isTempDisplay);
4321      return NapiGetUndefined(env);
4322  }
4323  
GetNativeSession() const4324  sptr<SceneSession> JsSceneSession::GetNativeSession() const
4325  {
4326      return weakSession_.promote();
4327  }
4328  
OnSetTemporarilyShowWhenLocked(napi_env env,napi_callback_info info)4329  napi_value JsSceneSession::OnSetTemporarilyShowWhenLocked(napi_env env, napi_callback_info info)
4330  {
4331      size_t argc = 4;
4332      napi_value argv[4] = { nullptr };
4333      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4334      if (argc < 1) {
4335          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]argc is invalid : %{public}zu", argc);
4336          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4337              "Input parameter is missing or invalid"));
4338          return NapiGetUndefined(env);
4339      }
4340      bool isTemporarilyShowWhenLocked = false;
4341      if (!ConvertFromJsValue(env, argv[0], isTemporarilyShowWhenLocked)) {
4342          TLOGE(WmsLogTag::WMS_SCB, "[NAPI] Failed to convert parameter to bool");
4343          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4344              "Input parameter is missing or invalid"));
4345          return NapiGetUndefined(env);
4346      }
4347      auto session = weakSession_.promote();
4348      if (session == nullptr) {
4349          TLOGE(WmsLogTag::WMS_SCB, "[NAPI] session_ is null");
4350          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4351              "Input parameter is missing or invalid"));
4352          return NapiGetUndefined(env);
4353      }
4354      session->SetTemporarilyShowWhenLocked(isTemporarilyShowWhenLocked);
4355      return NapiGetUndefined(env);
4356  }
4357  
OnSetSkipDraw(napi_env env,napi_callback_info info)4358  napi_value JsSceneSession::OnSetSkipDraw(napi_env env, napi_callback_info info)
4359  {
4360      size_t argc = 4;
4361      napi_value argv[4] = { nullptr };
4362      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4363      if (argc < 1) {
4364          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]argc is invalid : %{public}zu", argc);
4365          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4366              "Input parameter is missing or invalid"));
4367          return NapiGetUndefined(env);
4368      }
4369      bool skip = false;
4370      if (!ConvertFromJsValue(env, argv[0], skip)) {
4371          TLOGE(WmsLogTag::WMS_SCB, "[NAPI] Failed to convert parameter to bool");
4372          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4373              "Input parameter is missing or invalid"));
4374          return NapiGetUndefined(env);
4375      }
4376      auto session = weakSession_.promote();
4377      if (session == nullptr) {
4378          TLOGE(WmsLogTag::WMS_SCB, "[NAPI] session_ is null");
4379          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4380              "Input parameter is missing or invalid"));
4381          return NapiGetUndefined(env);
4382      }
4383      session->SetSkipDraw(skip);
4384      return NapiGetUndefined(env);
4385  }
4386  
GetJSCallback(const std::string & functionName)4387  std::shared_ptr<NativeReference> JsSceneSession::GetJSCallback(const std::string& functionName)
4388  {
4389      HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsSceneSession::GetJSCallback[%s]", functionName.c_str());
4390      std::shared_ptr<NativeReference> jsCallBack = nullptr;
4391      std::shared_lock<std::shared_mutex> lock(jsCbMapMutex_);
4392      auto iter = jsCbMap_.find(functionName);
4393      if (iter == jsCbMap_.end()) {
4394          TLOGE(WmsLogTag::DEFAULT, "%{public}s callback not found!", functionName.c_str());
4395      } else {
4396          jsCallBack = iter->second;
4397      }
4398      return jsCallBack;
4399  }
4400  
OnSetSkipSelfWhenShowOnVirtualScreen(napi_env env,napi_callback_info info)4401  napi_value JsSceneSession::OnSetSkipSelfWhenShowOnVirtualScreen(napi_env env, napi_callback_info info)
4402  {
4403      size_t argc = 4;
4404      napi_value argv[4] = {nullptr};
4405      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4406      if (argc < 1) { // 1: params num
4407          WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
4408          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4409              "Input parameter is missing or invalid"));
4410          return NapiGetUndefined(env);
4411      }
4412      bool isSkip = false;
4413      if (!ConvertFromJsValue(env, argv[0], isSkip)) {
4414          WLOGFE("[NAPI]Failed to convert parameter to bool");
4415          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4416              "Input parameter is missing or invalid"));
4417          return NapiGetUndefined(env);
4418      }
4419      auto session = weakSession_.promote();
4420      if (session == nullptr) {
4421          WLOGFE("[NAPI]session is nullptr, id:%{public}d", persistentId_);
4422          return NapiGetUndefined(env);
4423      }
4424      session->SetSkipSelfWhenShowOnVirtualScreen(isSkip);
4425      WLOGFI("[NAPI]OnSetSkipSelfWhenShowOnVirtualScreen end");
4426      return NapiGetUndefined(env);
4427  }
4428  
OnSetCompatibleModeInPc(napi_env env,napi_callback_info info)4429  napi_value JsSceneSession::OnSetCompatibleModeInPc(napi_env env, napi_callback_info info)
4430  {
4431      size_t argc = 4;
4432      napi_value argv[4] = {nullptr};
4433      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4434  
4435      if (argc < ARGC_TWO) {
4436          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
4437          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4438              "Input parameter is missing or invalid"));
4439          return NapiGetUndefined(env);
4440      }
4441  
4442      bool enable = false;
4443      if (!ConvertFromJsValue(env, argv[0], enable)) {
4444          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to enable");
4445          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4446              "Input parameter is missing or invalid"));
4447          return NapiGetUndefined(env);
4448      }
4449  
4450      bool isSupportDragInPcCompatibleMode = false;
4451      if (!ConvertFromJsValue(env, argv[ARGC_ONE], isSupportDragInPcCompatibleMode)) {
4452          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to isSupportDragInPcCompatibleMode");
4453          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4454              "Input parameter is missing or invalid"));
4455          return NapiGetUndefined(env);
4456      }
4457  
4458      auto session = weakSession_.promote();
4459      if (session == nullptr) {
4460          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4461          return NapiGetUndefined(env);
4462      }
4463      session->SetCompatibleModeInPc(enable, isSupportDragInPcCompatibleMode);
4464      return NapiGetUndefined(env);
4465  }
4466  
OnSetCompatibleWindowSizeInPc(napi_env env,napi_callback_info info)4467  napi_value JsSceneSession::OnSetCompatibleWindowSizeInPc(napi_env env, napi_callback_info info)
4468  {
4469      size_t argc = ARGC_FOUR;
4470      napi_value argv[ARGC_FOUR] = {nullptr};
4471      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4472      if (argc < ARGC_FOUR) {
4473          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
4474          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4475              "Input parameter is missing or invalid"));
4476          return NapiGetUndefined(env);
4477      }
4478      int32_t portraitWidth = 0;
4479      if (!ConvertFromJsValue(env, argv[ARG_INDEX_0], portraitWidth)) {
4480          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to portraitWidth");
4481          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4482              "Input parameter is missing or invalid"));
4483          return NapiGetUndefined(env);
4484      }
4485      int32_t portraitHeight = 0;
4486      if (!ConvertFromJsValue(env, argv[ARG_INDEX_1], portraitHeight)) {
4487          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to portraitHeight");
4488          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4489              "Input parameter is missing or invalid"));
4490          return NapiGetUndefined(env);
4491      }
4492      int32_t landscapeWidth = 0;
4493      if (!ConvertFromJsValue(env, argv[ARG_INDEX_2], landscapeWidth)) {
4494          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to landscapeWidth");
4495          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4496              "Input parameter is missing or invalid"));
4497          return NapiGetUndefined(env);
4498      }
4499      int32_t landscapeHeight = 0;
4500      if (!ConvertFromJsValue(env, argv[ARG_INDEX_3], landscapeHeight)) {
4501          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to landscapeHeight");
4502          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4503              "Input parameter is missing or invalid"));
4504          return NapiGetUndefined(env);
4505      }
4506      auto session = weakSession_.promote();
4507      if (session == nullptr) {
4508          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4509          return NapiGetUndefined(env);
4510      }
4511      session->SetCompatibleWindowSizeInPc(portraitWidth, portraitHeight, landscapeWidth, landscapeHeight);
4512      return NapiGetUndefined(env);
4513  }
4514  
OnSetAppSupportPhoneInPc(napi_env env,napi_callback_info info)4515  napi_value JsSceneSession::OnSetAppSupportPhoneInPc(napi_env env, napi_callback_info info)
4516  {
4517      size_t argc = ARGC_FOUR;
4518      napi_value argv[ARGC_FOUR] = { nullptr };
4519      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4520      if (argc < ARGC_ONE) {
4521          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
4522          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4523              "Input parameter is missing or invalid"));
4524          return NapiGetUndefined(env);
4525      }
4526      bool isSupportPhone = false;
4527      if (!ConvertFromJsValue(env, argv[ARG_INDEX_0], isSupportPhone)) {
4528          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to isSupportPhone");
4529          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4530              "Input parameter is missing or invalid"));
4531          return NapiGetUndefined(env);
4532      }
4533      auto session = weakSession_.promote();
4534      if (session == nullptr) {
4535          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4536          return NapiGetUndefined(env);
4537      }
4538      session->SetAppSupportPhoneInPc(isSupportPhone);
4539      return NapiGetUndefined(env);
4540  }
4541  
OnSetCompatibleModeEnableInPad(napi_env env,napi_callback_info info)4542  napi_value JsSceneSession::OnSetCompatibleModeEnableInPad(napi_env env, napi_callback_info info)
4543  {
4544      size_t argc = ARGC_FOUR;
4545      napi_value argv[ARGC_FOUR] = { nullptr };
4546      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4547      if (argc != ARGC_ONE) {
4548          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
4549          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4550              "Input parameter is missing or invalid"));
4551          return NapiGetUndefined(env);
4552      }
4553  
4554      bool enable = false;
4555      if (!ConvertFromJsValue(env, argv[ARG_INDEX_0], enable)) {
4556          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to portraitWidth");
4557          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4558              "Input parameter is missing or invalid"));
4559          return NapiGetUndefined(env);
4560      }
4561  
4562      auto session = weakSession_.promote();
4563      if (session == nullptr) {
4564          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4565          return NapiGetUndefined(env);
4566      }
4567      session->SetCompatibleModeEnableInPad(enable);
4568      return NapiGetUndefined(env);
4569  }
4570  
OnSetUniqueDensityDpiFromSCB(napi_env env,napi_callback_info info)4571  napi_value JsSceneSession::OnSetUniqueDensityDpiFromSCB(napi_env env, napi_callback_info info)
4572  {
4573      size_t argc = ARG_COUNT_4;
4574      napi_value argv[ARG_COUNT_4] = {nullptr};
4575      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4576      bool paramValidFlag = true;
4577      bool useUnique = false;
4578      uint32_t densityDpi = 0;
4579      std::string errMsg = "";
4580      if (argc < ARGC_TWO) {
4581          TLOGE(WmsLogTag::WMS_SCB, "Params not match %{public}zu", argc);
4582          errMsg = "Invalid args count, need two arg!";
4583          paramValidFlag = false;
4584      } else {
4585          if (!ConvertFromJsValue(env, argv[0], useUnique)) {
4586              TLOGE(WmsLogTag::WMS_SCB, "Failed to convert parameter to useUnique");
4587              errMsg = "Failed to convert parameter to useUnique";
4588              paramValidFlag = false;
4589          }
4590          if (paramValidFlag && !ConvertFromJsValue(env, argv[1], densityDpi)) {
4591              TLOGE(WmsLogTag::WMS_SCB, "Failed to convert parameter to densityDpi");
4592              errMsg = "Failed to convert parameter to densityDpi";
4593              paramValidFlag = false;
4594          }
4595      }
4596      if (!paramValidFlag) {
4597          TLOGE(WmsLogTag::WMS_SCB, "paramValidFlag error");
4598          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM), errMsg));
4599          return NapiGetUndefined(env);
4600      }
4601  
4602      auto session = weakSession_.promote();
4603      if (!session) {
4604          TLOGE(WmsLogTag::WMS_SCB, "[NAPI] session is nullptr, id:%{public}d", persistentId_);
4605          return NapiGetUndefined(env);
4606      }
4607      session->SetUniqueDensityDpi(useUnique, densityDpi);
4608      return NapiGetUndefined(env);
4609  }
4610  
OnSetBlankFlag(napi_env env,napi_callback_info info)4611  napi_value JsSceneSession::OnSetBlankFlag(napi_env env, napi_callback_info info)
4612  {
4613      size_t argc = ARGC_FOUR;
4614      napi_value argv[ARGC_FOUR] = {nullptr};
4615      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4616  
4617      if (argc < ARGC_ONE) {
4618          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
4619          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4620              "Input parameter is missing or invalid"));
4621          return NapiGetUndefined(env);
4622      }
4623  
4624      bool isAddBlank = false;
4625      if (!ConvertFromJsValue(env, argv[0], isAddBlank)) {
4626          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to isAddBlank");
4627          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4628              "Input parameter is missing or invalid"));
4629          return NapiGetUndefined(env);
4630      }
4631  
4632      auto session = weakSession_.promote();
4633      if (session == nullptr) {
4634          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4635          return NapiGetUndefined(env);
4636      }
4637      session->SetBlankFlag(isAddBlank);
4638      return NapiGetUndefined(env);
4639  }
4640  
OnRemoveBlank(napi_env env,napi_callback_info info)4641  napi_value JsSceneSession::OnRemoveBlank(napi_env env, napi_callback_info info)
4642  {
4643      auto session = weakSession_.promote();
4644      if (session == nullptr) {
4645          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4646          return NapiGetUndefined(env);
4647      }
4648      session->NotifyRemoveBlank();
4649      return NapiGetUndefined(env);
4650  }
4651  
OnSetBufferAvailableCallbackEnable(napi_env env,napi_callback_info info)4652  napi_value JsSceneSession::OnSetBufferAvailableCallbackEnable(napi_env env, napi_callback_info info)
4653  {
4654      size_t argc = ARGC_FOUR;
4655      napi_value argv[ARGC_FOUR] = {nullptr};
4656      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4657  
4658      if (argc < ARGC_ONE) {
4659          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
4660          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4661              "Input parameter is missing or invalid"));
4662          return NapiGetUndefined(env);
4663      }
4664  
4665      bool enable = false;
4666      if (!ConvertFromJsValue(env, argv[0], enable)) {
4667          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to enable");
4668          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4669              "Input parameter is missing or invalid"));
4670          return NapiGetUndefined(env);
4671      }
4672  
4673      auto session = weakSession_.promote();
4674      if (session == nullptr) {
4675          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4676          return NapiGetUndefined(env);
4677      }
4678      session->SetBufferAvailableCallbackEnable(enable);
4679      return NapiGetUndefined(env);
4680  }
4681  
OnIsDeviceWakeupByApplication(napi_env env,napi_callback_info info)4682  napi_value JsSceneSession::OnIsDeviceWakeupByApplication(napi_env env, napi_callback_info info)
4683  {
4684      auto session = weakSession_.promote();
4685      if (session == nullptr) {
4686          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is null, id:%{public}d", persistentId_);
4687          return NapiGetUndefined(env);
4688      }
4689      auto result = session->IsDeviceWakeupByApplication();
4690      napi_value jsResult;
4691      napi_get_boolean(env, result, &jsResult);
4692      return jsResult;
4693  }
4694  
OnSyncDefaultRequestedOrientation(napi_env env,napi_callback_info info)4695  napi_value JsSceneSession::OnSyncDefaultRequestedOrientation(napi_env env, napi_callback_info info)
4696  {
4697      size_t argc = ARGC_FOUR;
4698      napi_value argv[ARGC_FOUR] = { nullptr };
4699      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4700      if (argc != ARGC_ONE) {
4701          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
4702          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4703              "Input parameter is missing or invalid"));
4704          return NapiGetUndefined(env);
4705      }
4706      uint32_t defaultRequestedOrientation = 0;
4707      if (!ConvertFromJsValue(env, argv[0], defaultRequestedOrientation)) {
4708          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to defaultRequestedOrientation");
4709          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4710              "Input parameter is missing or invalid"));
4711          return NapiGetUndefined(env);
4712      }
4713      auto session = weakSession_.promote();
4714      if (session == nullptr) {
4715          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4716          return NapiGetUndefined(env);
4717      }
4718      auto windowOrientation = static_cast<Orientation>(defaultRequestedOrientation);
4719      if (windowOrientation < Orientation::BEGIN || windowOrientation > Orientation::END) {
4720          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Orientation %{public}u invalid, id:%{public}d",
4721              defaultRequestedOrientation, persistentId_);
4722          return NapiGetUndefined(env);
4723      }
4724      session->SetDefaultRequestedOrientation(windowOrientation);
4725      return NapiGetUndefined(env);
4726  }
4727  
OnSetIsPcAppInPad(napi_env env,napi_callback_info info)4728  napi_value JsSceneSession::OnSetIsPcAppInPad(napi_env env, napi_callback_info info)
4729  {
4730      size_t argc = ARGC_FOUR;
4731      napi_value argv[ARGC_FOUR] = {nullptr};
4732      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4733      if (argc < ARGC_ONE) {
4734          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
4735          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4736                                        "Input parameter is missing or invalid"));
4737          return NapiGetUndefined(env);
4738      }
4739      bool enable = false;
4740      if (!ConvertFromJsValue(env, argv[0], enable)) {
4741          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to enable");
4742          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4743                                        "Input parameter is missing or invalid"));
4744          return NapiGetUndefined(env);
4745      }
4746      auto session = weakSession_.promote();
4747      if (session == nullptr) {
4748          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr");
4749          return NapiGetUndefined(env);
4750      }
4751      session->SetIsPcAppInPad(enable);
4752      return NapiGetUndefined(env);
4753  }
4754  
OnSetStartingWindowExitAnimationFlag(napi_env env,napi_callback_info info)4755  napi_value JsSceneSession::OnSetStartingWindowExitAnimationFlag(napi_env env, napi_callback_info info)
4756  {
4757      size_t argc = ARGC_FOUR;
4758      napi_value argv[ARGC_FOUR] = {nullptr};
4759      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4760  
4761      if (argc != ARGC_ONE) {
4762          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
4763          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4764              "Input parameter is missing or invalid"));
4765          return NapiGetUndefined(env);
4766      }
4767  
4768      bool enable = true;
4769      if (!ConvertFromJsValue(env, argv[0], enable)) {
4770          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Failed to convert parameter to enable");
4771          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4772              "Input parameter is missing or invalid"));
4773          return NapiGetUndefined(env);
4774      }
4775  
4776      auto session = weakSession_.promote();
4777      if (session == nullptr) {
4778          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is null, id:%{public}d", persistentId_);
4779          return NapiGetUndefined(env);
4780      }
4781      session->SetStartingWindowExitAnimationFlag(enable);
4782      return NapiGetUndefined(env);
4783  }
4784  
OnSyncScenePanelGlobalPosition(napi_env env,napi_callback_info info)4785  napi_value JsSceneSession::OnSyncScenePanelGlobalPosition(napi_env env, napi_callback_info info)
4786  {
4787      size_t argc = ARGC_FOUR;
4788      napi_value argv[ARGC_FOUR] = { nullptr };
4789      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4790  
4791      if (argc != ARGC_ONE) {
4792          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
4793          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4794              "Input parameter is missing or invalid"));
4795          return NapiGetUndefined(env);
4796      }
4797  
4798      std::string reason;
4799      if (!ConvertFromJsValue(env, argv[0], reason)) {
4800          TLOGE(WmsLogTag::WMS_PIPELINE, "[NAPI]Failed to convert parameter to sync reason");
4801          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4802              "Input parameter is missing or invalid"));
4803          return NapiGetUndefined(env);
4804      }
4805      auto it = std::find_if(g_syncGlobalPositionPermission.begin(), g_syncGlobalPositionPermission.end(),
4806          [reason](const std::string& permission) { return permission.find(reason) != std::string::npos; });
4807      if (it == g_syncGlobalPositionPermission.end()) {
4808          TLOGE(WmsLogTag::WMS_PIPELINE, "[NAPI]called reason:%{public}s is not permitted", reason.c_str());
4809          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_NO_PERMISSION),
4810              "Input parameter is missing or invalid"));
4811          return NapiGetUndefined(env);
4812      }
4813      TLOGI(WmsLogTag::WMS_PIPELINE, "[NAPI]called reason:%{public}s", reason.c_str());
4814      auto session = weakSession_.promote();
4815      if (session == nullptr) {
4816          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4817          return NapiGetUndefined(env);
4818      }
4819      session->SyncScenePanelGlobalPosition(true);
4820      return NapiGetUndefined(env);
4821  }
4822  
OnUnSyncScenePanelGlobalPosition(napi_env env,napi_callback_info info)4823  napi_value JsSceneSession::OnUnSyncScenePanelGlobalPosition(napi_env env, napi_callback_info info)
4824  {
4825      size_t argc = ARGC_FOUR;
4826      napi_value argv[ARGC_FOUR] = { nullptr };
4827      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4828  
4829      if (argc != ARGC_ONE) {
4830          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]Argc is invalid: %{public}zu", argc);
4831          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4832              "Input parameter is missing or invalid"));
4833          return NapiGetUndefined(env);
4834      }
4835  
4836      std::string reason;
4837      if (!ConvertFromJsValue(env, argv[0], reason)) {
4838          TLOGE(WmsLogTag::WMS_PIPELINE, "[NAPI]Failed to convert parameter to un sync reason");
4839          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4840              "Input parameter is missing or invalid"));
4841          return NapiGetUndefined(env);
4842      }
4843      auto it = std::find_if(g_syncGlobalPositionPermission.begin(), g_syncGlobalPositionPermission.end(),
4844          [reason](const std::string& permission) { return permission.find(reason) != std::string::npos; });
4845      if (it == g_syncGlobalPositionPermission.end()) {
4846          TLOGE(WmsLogTag::WMS_PIPELINE, "[NAPI]called reason:%{public}s is not permitted", reason.c_str());
4847          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_NO_PERMISSION),
4848              "Input parameter is missing or invalid"));
4849          return NapiGetUndefined(env);
4850      }
4851      TLOGI(WmsLogTag::WMS_PIPELINE, "[NAPI]called reason:%{public}s", reason.c_str());
4852      auto session = weakSession_.promote();
4853      if (session == nullptr) {
4854          TLOGE(WmsLogTag::WMS_SCB, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4855          return NapiGetUndefined(env);
4856      }
4857      session->SyncScenePanelGlobalPosition(false);
4858      return NapiGetUndefined(env);
4859  }
4860  
OnSetIsActivatedAfterScreenLocked(napi_env env,napi_callback_info info)4861  napi_value JsSceneSession::OnSetIsActivatedAfterScreenLocked(napi_env env, napi_callback_info info)
4862  {
4863      size_t argc = ARGC_FOUR;
4864      napi_value argv[ARGC_FOUR] = {nullptr};
4865      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4866      if (argc != ARGC_ONE) {
4867          TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]Argc is invalid: %{public}zu", argc);
4868          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM), "InputInvalid"));
4869          return NapiGetUndefined(env);
4870      }
4871      bool isActivatedAfterScreenLocked = false;
4872      if (!ConvertFromJsValue(env, argv[0], isActivatedAfterScreenLocked)) {
4873          TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]Failed to convert parameter to isActivatedAfterScreenLocked");
4874          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4875              "Input parameter is missing or invalid"));
4876          return NapiGetUndefined(env);
4877      }
4878      TLOGD(WmsLogTag::WMS_LIFE, "[NAPI]isActivatedAfterScreenLocked: %{public}u", isActivatedAfterScreenLocked);
4879      auto session = weakSession_.promote();
4880      if (session == nullptr) {
4881          TLOGE(WmsLogTag::WMS_LIFE, "[NAPI]session is null, id: %{public}d", persistentId_);
4882          return NapiGetUndefined(env);
4883      }
4884      session->SetIsActivatedAfterScreenLocked(isActivatedAfterScreenLocked);
4885      return NapiGetUndefined(env);
4886  }
4887  
OnSetNeedSyncSessionRect(napi_env env,napi_callback_info info)4888  napi_value JsSceneSession::OnSetNeedSyncSessionRect(napi_env env, napi_callback_info info)
4889  {
4890      size_t argc = ARGC_FOUR;
4891      napi_value argv[ARGC_FOUR] = { nullptr };
4892      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4893  
4894      if (argc != ARGC_ONE) {
4895          TLOGE(WmsLogTag::WMS_PIPELINE, "[NAPI]Argc is invalid: %{public}zu", argc);
4896          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4897              "Input parameter is missing or invalid"));
4898          return NapiGetUndefined(env);
4899      }
4900  
4901      bool needSync = true;
4902      if (!ConvertFromJsValue(env, argv[0], needSync)) {
4903          TLOGE(WmsLogTag::WMS_PIPELINE, "[NAPI]Failed to convert parameter to needSync");
4904          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4905              "Input parameter is missing or invalid"));
4906          return NapiGetUndefined(env);
4907      }
4908      TLOGI(WmsLogTag::WMS_PIPELINE, "[NAPI]needSync:%{public}u, id:%{public}d", needSync, persistentId_);
4909      auto session = weakSession_.promote();
4910      if (session == nullptr) {
4911          TLOGE(WmsLogTag::WMS_PIPELINE, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4912          return NapiGetUndefined(env);
4913      }
4914      session->SetNeedSyncSessionRect(needSync);
4915      return NapiGetUndefined(env);
4916  }
4917  
OnSetUseStartingWindowAboveLocked(napi_env env,napi_callback_info info)4918  napi_value JsSceneSession::OnSetUseStartingWindowAboveLocked(napi_env env, napi_callback_info info)
4919  {
4920      size_t argc = ARGC_FOUR;
4921      napi_value argv[ARGC_FOUR] = { nullptr };
4922      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4923      if (argc != ARGC_ONE) {
4924          TLOGE(WmsLogTag::DEFAULT, "[NAPI]Argc is invalid: %{public}zu", argc);
4925          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4926              "Input parameter is missing or invalid"));
4927          return NapiGetUndefined(env);
4928      }
4929  
4930      bool useStartingWindowAboveLocked = false;
4931      if (!ConvertFromJsValue(env, argv[0], useStartingWindowAboveLocked)) {
4932          TLOGE(WmsLogTag::DEFAULT, "[NAPI]Failed to convert parameter to useStartingWindowAboveLocked");
4933          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4934              "Input parameter is missing or invalid"));
4935          return NapiGetUndefined(env);
4936      }
4937      auto session = weakSession_.promote();
4938      if (session == nullptr) {
4939          TLOGE(WmsLogTag::DEFAULT, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4940          return NapiGetUndefined(env);
4941      }
4942      session->SetUseStartingWindowAboveLocked(useStartingWindowAboveLocked);
4943      return NapiGetUndefined(env);
4944  }
4945  
OnSetWindowEnableDragBySystem(napi_env env,napi_callback_info info)4946  napi_value JsSceneSession::OnSetWindowEnableDragBySystem(napi_env env, napi_callback_info info)
4947  {
4948      size_t argc = ARGC_FOUR;
4949      napi_value argv[ARGC_FOUR] = { nullptr };
4950      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4951      if (argc != ARGC_ONE) {
4952          TLOGE(WmsLogTag::WMS_LAYOUT, "[NAPI]Argc is invalid: %{public}zu", argc);
4953          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
4954              "Input parameter is missing or invalid"));
4955          return NapiGetUndefined(env);
4956      }
4957  
4958      bool enableDrag = true;
4959      if (!ConvertFromJsValue(env, argv[0], enableDrag)) {
4960          TLOGE(WmsLogTag::WMS_LAYOUT, "[NAPI]Failed to convert parameter to bool");
4961          return NapiGetUndefined(env);
4962      }
4963  
4964      auto session = weakSession_.promote();
4965      if (session == nullptr) {
4966          TLOGE(WmsLogTag::WMS_LAYOUT, "[NAPI]session is nullptr, id:%{public}d", persistentId_);
4967          return NapiGetUndefined(env);
4968      }
4969      session->SetWindowEnableDragBySystem(enableDrag);
4970      return NapiGetUndefined(env);
4971  }
4972  
ProcessSetWindowRectAutoSaveRegister()4973  void JsSceneSession::ProcessSetWindowRectAutoSaveRegister()
4974  {
4975      auto session = weakSession_.promote();
4976      if (session == nullptr) {
4977          TLOGE(WmsLogTag::WMS_MAIN, "session is nullptr, id:%{public}d", persistentId_);
4978          return;
4979      }
4980      const char* const where = __func__;
4981      session->SetWindowRectAutoSaveCallback([weakThis = wptr(this), where](bool enabled) {
4982          auto jsSceneSession = weakThis.promote();
4983          if (!jsSceneSession) {
4984              TLOGNE(WmsLogTag::WMS_MAIN, "%{pubilc}s: jsSceneSession is null", where);
4985              return;
4986          }
4987          jsSceneSession->OnSetWindowRectAutoSave(enabled);
4988      });
4989      TLOGI(WmsLogTag::WMS_MAIN, "success");
4990  }
4991  
OnSetWindowRectAutoSave(bool enabled)4992  void JsSceneSession::OnSetWindowRectAutoSave(bool enabled)
4993  {
4994      const char* const where = __func__;
4995      auto task = [weakThis = wptr(this), persistentId = persistentId_, enabled, env = env_, where] {
4996          auto jsSceneSession = weakThis.promote();
4997          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
4998              TLOGNE(WmsLogTag::WMS_MAIN, "%{public}s: jsSceneSession id:%{public}d has been destroyed",
4999                  where, persistentId);
5000              return;
5001          }
5002          auto jsCallBack = jsSceneSession->GetJSCallback(SET_WINDOW_RECT_AUTO_SAVE_CB);
5003          if (!jsCallBack) {
5004              TLOGNE(WmsLogTag::WMS_MAIN, "%{public}s: jsCallBack is nullptr", where);
5005              return;
5006          }
5007          napi_value jsEnabled = CreateJsValue(env, enabled);
5008          napi_value argv[] = {jsEnabled};
5009          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
5010      };
5011      taskScheduler_->PostMainThreadTask(task, __func__);
5012  }
5013  
RegisterUpdateAppUseControlCallback()5014  void JsSceneSession::RegisterUpdateAppUseControlCallback()
5015  {
5016      auto session = weakSession_.promote();
5017      if (session == nullptr) {
5018          TLOGE(WmsLogTag::WMS_LIFE, "session is nullptr, id:%{public}d", persistentId_);
5019          return;
5020      }
5021      const char* const where = __func__;
5022      session->RegisterUpdateAppUseControlCallback(
5023          [weakThis = wptr(this), where](ControlAppType type, bool isNeedControl) {
5024          auto jsSceneSession = weakThis.promote();
5025          if (!jsSceneSession) {
5026              TLOGNE(WmsLogTag::WMS_LIFE, "%{pubilc}s: jsSceneSession is null", where);
5027              return;
5028          }
5029          jsSceneSession->OnUpdateAppUseControl(type, isNeedControl);
5030      });
5031      TLOGI(WmsLogTag::WMS_LIFE, "success");
5032  }
5033  
OnUpdateAppUseControl(ControlAppType type,bool isNeedControl)5034  void JsSceneSession::OnUpdateAppUseControl(ControlAppType type, bool isNeedControl)
5035  {
5036      const char* const where = __func__;
5037      auto task = [weakThis = wptr(this), persistentId = persistentId_, type, isNeedControl, env = env_, where] {
5038          auto jsSceneSession = weakThis.promote();
5039          if (!jsSceneSession || jsSceneSessionMap_.find(persistentId) == jsSceneSessionMap_.end()) {
5040              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s: jsSceneSession id:%{public}d has been destroyed",
5041                  where, persistentId);
5042              return;
5043          }
5044          auto jsCallBack = jsSceneSession->GetJSCallback(UPDATE_APP_USE_CONTROL_CB);
5045          if (!jsCallBack) {
5046              TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s: jsCallBack is nullptr", where);
5047              return;
5048          }
5049          napi_value jsTypeArgv = CreateJsValue(env, static_cast<uint8_t>(type));
5050          napi_value jsIsNeedControlArgv = CreateJsValue(env, isNeedControl);
5051          napi_value argv[] = { jsTypeArgv, jsIsNeedControlArgv };
5052          napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr);
5053      };
5054      taskScheduler_->PostMainThreadTask(task, __func__);
5055  }
5056  
OnSetFreezeImmediately(napi_env env,napi_callback_info info)5057  napi_value JsSceneSession::OnSetFreezeImmediately(napi_env env, napi_callback_info info)
5058  {
5059      size_t argc = ARGC_FOUR;
5060      napi_value argv[ARGC_FOUR] = { nullptr };
5061      napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5062      if (argc != ARGC_TWO) {
5063          TLOGE(WmsLogTag::WMS_PATTERN, "Argc is invalid: %{public}zu", argc);
5064          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
5065              "Input parameter is missing or invalid"));
5066          return NapiGetUndefined(env);
5067      }
5068      double scaleValue;
5069      if (!ConvertFromJsValue(env, argv[0], scaleValue)) {
5070          TLOGE(WmsLogTag::WMS_PATTERN, "Failed to convert parameter to scaleValue");
5071          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
5072              "Input parameter is missing or invalid"));
5073          return NapiGetUndefined(env);
5074      }
5075      float scaleParam = GreatOrEqual(scaleValue, 0.0f) && LessOrEqual(scaleValue, 1.0f) ?
5076          static_cast<float>(scaleValue) : 0.0f;
5077      bool isFreeze = false;
5078      if (!ConvertFromJsValue(env, argv[1], isFreeze)) {
5079          TLOGE(WmsLogTag::WMS_PATTERN, "Failed to convert parameter to isFreeze");
5080          napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_INVALID_PARAM),
5081              "Input parameter is missing or invalid"));
5082          return NapiGetUndefined(env);
5083      }
5084      auto session = weakSession_.promote();
5085      if (session == nullptr) {
5086          TLOGE(WmsLogTag::WMS_PATTERN, "session is nullptr, id:%{public}d", persistentId_);
5087          return NapiGetUndefined(env);
5088      }
5089      std::shared_ptr<Media::PixelMap> pixelPtr = session->SetFreezeImmediately(scaleParam, isFreeze);
5090      if (isFreeze) {
5091          if (pixelPtr == nullptr) {
5092              TLOGE(WmsLogTag::WMS_PATTERN, "Failed to create pixelPtr");
5093              napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_STATE_ABNORMALLY),
5094                  "System is abnormal"));
5095              return NapiGetUndefined(env);
5096          }
5097          napi_value pixelMapObj = Media::PixelMapNapi::CreatePixelMap(env, pixelPtr);
5098          if (pixelMapObj == nullptr) {
5099              TLOGE(WmsLogTag::WMS_PATTERN, "Failed to create pixel map object");
5100              napi_throw(env, CreateJsError(env, static_cast<int32_t>(WSErrorCode::WS_ERROR_STATE_ABNORMALLY),
5101                  "System is abnormal"));
5102              return NapiGetUndefined(env);
5103          }
5104          return pixelMapObj;
5105      }
5106      return NapiGetUndefined(env);
5107  }
5108  } // namespace OHOS::Rosen
5109