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