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 #ifndef OHOS_WINDOW_SCENE_JS_SCENE_SESSION_H
17 #define OHOS_WINDOW_SCENE_JS_SCENE_SESSION_H
18 
19 #include <map>
20 
21 #include <js_runtime_utils.h>
22 #include <native_engine/native_engine.h>
23 #include <native_engine/native_value.h>
24 #include <refbase.h>
25 
26 #include "interfaces/include/ws_common.h"
27 #include "session/host/include/scene_session.h"
28 #include "js_scene_utils.h"
29 #include "task_scheduler.h"
30 
31 namespace OHOS::Rosen {
32 enum class ListenerFuncType : uint32_t {
33     PENDING_SCENE_CB,
34     CHANGE_SESSION_VISIBILITY_WITH_STATUS_BAR,
35     SESSION_STATE_CHANGE_CB,
36     BUFFER_AVAILABLE_CHANGE_CB,
37     SESSION_EVENT_CB,
38     SESSION_RECT_CHANGE_CB,
39     SESSION_PIP_CONTROL_STATUS_CHANGE_CB,
40     SESSION_AUTO_START_PIP_CB,
41     CREATE_SUB_SESSION_CB,
42     BIND_DIALOG_TARGET_CB,
43     RAISE_TO_TOP_CB,
44     RAISE_TO_TOP_POINT_DOWN_CB,
45     BACK_PRESSED_CB,
46     SESSION_FOCUSABLE_CHANGE_CB,
47     SESSION_TOUCHABLE_CHANGE_CB,
48     SESSION_TOP_MOST_CHANGE_CB,
49     SUB_MODAL_TYPE_CHANGE_CB,
50     MAIN_MODAL_TYPE_CHANGE_CB,
51     CLICK_CB,
52     TERMINATE_SESSION_CB,
53     TERMINATE_SESSION_CB_NEW,
54     TERMINATE_SESSION_CB_TOTAL,
55     SESSION_EXCEPTION_CB,
56     UPDATE_SESSION_LABEL_CB,
57     UPDATE_SESSION_ICON_CB,
58     SYSTEMBAR_PROPERTY_CHANGE_CB,
59     NEED_AVOID_CB,
60     PENDING_SESSION_TO_FOREGROUND_CB,
61     PENDING_SESSION_TO_BACKGROUND_FOR_DELEGATOR_CB,
62     CUSTOM_ANIMATION_PLAYING_CB,
63     NEED_DEFAULT_ANIMATION_FLAG_CHANGE_CB,
64     SHOW_WHEN_LOCKED_CB,
65     REQUESTED_ORIENTATION_CHANGE_CB,
66     RAISE_ABOVE_TARGET_CB,
67     FORCE_HIDE_CHANGE_CB,
68     WINDOW_DRAG_HOT_AREA_CB,
69     TOUCH_OUTSIDE_CB,
70     SESSIONINFO_LOCKEDSTATE_CHANGE_CB,
71     PREPARE_CLOSE_PIP_SESSION,
72     LANDSCAPE_MULTI_WINDOW_CB,
73     CONTEXT_TRANSPARENT_CB,
74     KEYBOARD_GRAVITY_CHANGE_CB,
75     ADJUST_KEYBOARD_LAYOUT_CB,
76     LAYOUT_FULL_SCREEN_CB,
77     DEFAULT_DENSITY_ENABLED_CB,
78     NEXT_FRAME_LAYOUT_FINISH_CB,
79     MAIN_WINDOW_TOP_MOST_CHANGE_CB,
80     TITLE_DOCK_HOVER_SHOW_CB,
81     SET_WINDOW_RECT_AUTO_SAVE_CB,
82     UPDATE_APP_USE_CONTROL_CB,
83     RESTORE_MAIN_WINDOW_CB,
84 };
85 
86 class SceneSession;
87 class JsSceneSession : public RefBase {
88 public:
89     JsSceneSession(napi_env env, const sptr<SceneSession>& session);
90     ~JsSceneSession();
91 
92     static napi_value Create(napi_env env, const sptr<SceneSession>& session);
93     static void Finalizer(napi_env env, void* data, void* hint);
94 
95     void ClearCbMap(bool needRemove, int32_t persistentId);
96     sptr<SceneSession> GetNativeSession() const;
97 
98 private:
99     static napi_value RegisterCallback(napi_env env, napi_callback_info info);
100     static napi_value UpdateNativeVisibility(napi_env env, napi_callback_info info);
101     static napi_value SetShowRecent(napi_env env, napi_callback_info info);
102     static napi_value SetZOrder(napi_env env, napi_callback_info info);
103     static napi_value SetTouchable(napi_env env, napi_callback_info info);
104     static napi_value SetSystemActive(napi_env env, napi_callback_info info);
105     static napi_value SetPrivacyMode(napi_env env, napi_callback_info info);
106     static napi_value SetFloatingScale(napi_env env, napi_callback_info info);
107     static napi_value SetIsMidScene(napi_env env, napi_callback_info info);
108     static napi_value SetSystemSceneOcclusionAlpha(napi_env env, napi_callback_info info);
109     static napi_value SetSystemSceneForceUIFirst(napi_env env, napi_callback_info info);
110     static napi_value MarkSystemSceneUIFirst(napi_env env, napi_callback_info info);
111     static napi_value SetFocusable(napi_env env, napi_callback_info info);
112     static napi_value SetFocusableOnShow(napi_env env, napi_callback_info info);
113     static napi_value SetSystemSceneBlockingFocus(napi_env env, napi_callback_info info);
114     static napi_value UpdateSizeChangeReason(napi_env env, napi_callback_info info);
115     static napi_value OpenKeyboardSyncTransaction(napi_env env, napi_callback_info info);
116     static napi_value CloseKeyboardSyncTransaction(napi_env env, napi_callback_info info);
117     static napi_value NotifyTargetScreenWidthAndHeight(napi_env env, napi_callback_info info);
118     static napi_value SetScale(napi_env env, napi_callback_info info);
119     static napi_value SetWindowLastSafeRect(napi_env env, napi_callback_info info);
120     static napi_value RequestHideKeyboard(napi_env env, napi_callback_info info);
121     static napi_value SetSCBKeepKeyboard(napi_env env, napi_callback_info info);
122     static napi_value SetOffset(napi_env env, napi_callback_info info);
123     static napi_value SetExitSplitOnBackground(napi_env env, napi_callback_info info);
124     static napi_value SetWaterMarkFlag(napi_env env, napi_callback_info info);
125     static napi_value SetPipActionEvent(napi_env env, napi_callback_info info);
126     static napi_value NotifyPipOcclusionChange(napi_env env, napi_callback_info info);
127     static napi_value SetPiPControlEvent(napi_env env, napi_callback_info info);
128     static napi_value NotifyDisplayStatusBarTemporarily(napi_env env, napi_callback_info info);
129     static napi_value SetTemporarilyShowWhenLocked(napi_env env, napi_callback_info info);
130     static napi_value SetSkipDraw(napi_env env, napi_callback_info info);
131     static napi_value SyncScenePanelGlobalPosition(napi_env env, napi_callback_info info);
132     static napi_value UnSyncScenePanelGlobalPosition(napi_env env, napi_callback_info info);
133     static napi_value SetNeedSyncSessionRect(napi_env env, napi_callback_info info);
134     static void BindNativeMethod(napi_env env, napi_value objValue, const char* moduleName);
135     static void BindNativeMethodForKeyboard(napi_env env, napi_value objValue, const char* moduleName);
136     static void BindNativeMethodForCompatiblePcMode(napi_env env, napi_value objValue, const char* moduleName);
137     static void BindNativeMethodForSCBSystemSession(napi_env env, napi_value objValue, const char* moduleName);
138     static void BindNativeMethodForFocus(napi_env env, napi_value objValue, const char* moduleName);
139     static napi_value SetSkipSelfWhenShowOnVirtualScreen(napi_env env, napi_callback_info info);
140     static napi_value SetCompatibleModeInPc(napi_env env, napi_callback_info info);
141     static napi_value SetCompatibleModeEnableInPad(napi_env env, napi_callback_info info);
142     static napi_value SetAppSupportPhoneInPc(napi_env env, napi_callback_info info);
143     static napi_value SetCompatibleWindowSizeInPc(napi_env env, napi_callback_info info);
144     static napi_value SetUniqueDensityDpiFromSCB(napi_env env, napi_callback_info info);
145     static napi_value SetBlankFlag(napi_env env, napi_callback_info info);
146     static napi_value RemoveBlank(napi_env env, napi_callback_info info);
147     static napi_value SetBufferAvailableCallbackEnable(napi_env env, napi_callback_info info);
148     static napi_value IsDeviceWakeupByApplication(napi_env env, napi_callback_info info);
149     static napi_value SyncDefaultRequestedOrientation(napi_env env, napi_callback_info info);
150     static napi_value SetIsPcAppInPad(napi_env env, napi_callback_info info);
151     static napi_value SetStartingWindowExitAnimationFlag(napi_env env, napi_callback_info info);
152     static napi_value SetIsActivatedAfterScreenLocked(napi_env env, napi_callback_info info);
153     static napi_value SetFrameGravity(napi_env env, napi_callback_info info);
154     static napi_value SetWindowEnableDragBySystem(napi_env env, napi_callback_info info);
155     static napi_value SetUseStartingWindowAboveLocked(napi_env env, napi_callback_info info);
156     static napi_value SetFreezeImmediately(napi_env env, napi_callback_info info);
157 
158     napi_value OnRegisterCallback(napi_env env, napi_callback_info info);
159     napi_value OnUpdateNativeVisibility(napi_env env, napi_callback_info info);
160     napi_value OnSetShowRecent(napi_env env, napi_callback_info info);
161     napi_value OnSetZOrder(napi_env env, napi_callback_info info);
162     napi_value OnSetTouchable(napi_env env, napi_callback_info info);
163     napi_value OnSetSystemActive(napi_env env, napi_callback_info info);
164     napi_value OnSetPrivacyMode(napi_env env, napi_callback_info info);
165     napi_value OnSetFloatingScale(napi_env env, napi_callback_info info);
166     napi_value OnSetIsMidScene(napi_env env, napi_callback_info info);
167     napi_value OnSetSystemSceneOcclusionAlpha(napi_env env, napi_callback_info info);
168     napi_value OnSetSystemSceneForceUIFirst(napi_env env, napi_callback_info info);
169     napi_value OnMarkSystemSceneUIFirst(napi_env env, napi_callback_info info);
170     napi_value OnSetFocusable(napi_env env, napi_callback_info info);
171     napi_value OnSetFocusableOnShow(napi_env env, napi_callback_info info);
172     napi_value OnSetSystemSceneBlockingFocus(napi_env env, napi_callback_info info);
173     napi_value OnUpdateSizeChangeReason(napi_env env, napi_callback_info info);
174     napi_value OnOpenKeyboardSyncTransaction(napi_env env, napi_callback_info info);
175     napi_value OnCloseKeyboardSyncTransaction(napi_env env, napi_callback_info info);
176     napi_value OnNotifyTargetScreenWidthAndHeight(napi_env env, napi_callback_info info);
177     napi_value OnSetScale(napi_env env, napi_callback_info info);
178     napi_value OnSetWindowLastSafeRect(napi_env env, napi_callback_info info);
179     napi_value OnRequestHideKeyboard(napi_env env, napi_callback_info info);
180     napi_value OnSetSCBKeepKeyboard(napi_env env, napi_callback_info info);
181     napi_value OnSetOffset(napi_env env, napi_callback_info info);
182     napi_value OnSetExitSplitOnBackground(napi_env env, napi_callback_info info);
183     napi_value OnSetWaterMarkFlag(napi_env env, napi_callback_info info);
184     napi_value OnSetPipActionEvent(napi_env env, napi_callback_info info);
185     napi_value OnSetPiPControlEvent(napi_env env, napi_callback_info info);
186     napi_value OnNotifyPipOcclusionChange(napi_env env, napi_callback_info info);
187     napi_value OnNotifyDisplayStatusBarTemporarily(napi_env env, napi_callback_info info);
188     napi_value OnSetTemporarilyShowWhenLocked(napi_env env, napi_callback_info info);
189     napi_value OnSetSkipDraw(napi_env env, napi_callback_info info);
190     napi_value OnSetSkipSelfWhenShowOnVirtualScreen(napi_env env, napi_callback_info info);
191     napi_value OnSetCompatibleModeInPc(napi_env env, napi_callback_info info);
192     napi_value OnSetAppSupportPhoneInPc(napi_env env, napi_callback_info info);
193     napi_value OnSetCompatibleWindowSizeInPc(napi_env env, napi_callback_info info);
194     napi_value OnSetCompatibleModeEnableInPad(napi_env env, napi_callback_info info);
195     napi_value OnSetUniqueDensityDpiFromSCB(napi_env env, napi_callback_info info);
196     napi_value OnSetBlankFlag(napi_env env, napi_callback_info info);
197     napi_value OnRemoveBlank(napi_env env, napi_callback_info info);
198     napi_value OnSetBufferAvailableCallbackEnable(napi_env env, napi_callback_info info);
199     napi_value OnIsDeviceWakeupByApplication(napi_env env, napi_callback_info info);
200     napi_value OnSyncDefaultRequestedOrientation(napi_env env, napi_callback_info info);
201     napi_value OnSetIsPcAppInPad(napi_env env, napi_callback_info info);
202     napi_value OnSetStartingWindowExitAnimationFlag(napi_env env, napi_callback_info info);
203     napi_value OnSyncScenePanelGlobalPosition(napi_env env, napi_callback_info info);
204     napi_value OnUnSyncScenePanelGlobalPosition(napi_env env, napi_callback_info info);
205     napi_value OnSetNeedSyncSessionRect(napi_env env, napi_callback_info info);
206     napi_value OnSetIsActivatedAfterScreenLocked(napi_env env, napi_callback_info info);
207     napi_value OnSetFrameGravity(napi_env env, napi_callback_info info);
208     napi_value OnSetWindowEnableDragBySystem(napi_env env, napi_callback_info info);
209     napi_value OnSetUseStartingWindowAboveLocked(napi_env env, napi_callback_info info);
210     napi_value OnSetFreezeImmediately(napi_env env, napi_callback_info info);
211 
212     bool IsCallbackRegistered(napi_env env, const std::string& type, napi_value jsListenerObject);
213     void ProcessChangeSessionVisibilityWithStatusBarRegister();
214     void InitListenerFuncs();
215     void ProcessPendingSceneSessionActivationRegister();
216     void ProcessSessionStateChangeRegister();
217     void ProcessBufferAvailableChangeRegister();
218     void ProcessSessionEventRegister();
219     void ProcessCreateSubSessionRegister();
220     void ProcessBindDialogTargetRegister();
221     void ProcessSessionRectChangeRegister();
222     void ProcessSessionPiPControlStatusChangeRegister();
223     void ProcessAutoStartPiPStatusChangeRegister();
224     void ProcessRaiseToTopRegister();
225     void ProcessRaiseToTopForPointDownRegister();
226     void ProcessBackPressedRegister();
227     void ProcessSessionFocusableChangeRegister();
228     void ProcessSessionTouchableChangeRegister();
229     void ProcessSessionTopmostChangeRegister();
230     void ProcessMainWindowTopmostChangeRegister();
231     void ProcessSubModalTypeChangeRegister();
232     void ProcessMainModalTypeChangeRegister();
233     void ProcessClickRegister();
234     void ProcessTerminateSessionRegister();
235     void ProcessTerminateSessionRegisterNew();
236     void ProcessTerminateSessionRegisterTotal();
237     void ProcessSessionExceptionRegister();
238     void ProcessUpdateSessionLabelRegister();
239     void ProcessUpdateSessionIconRegister();
240     void ProcessSystemBarPropertyChangeRegister();
241     void ProcessNeedAvoidRegister();
242     void ProcessPendingSessionToForegroundRegister();
243     void ProcessPendingSessionToBackgroundForDelegatorRegister();
244     void ProcessSessionDefaultAnimationFlagChangeRegister();
245     void ProcessIsCustomAnimationPlaying();
246     void ProcessShowWhenLockedRegister();
247     void ProcessRequestedOrientationChange();
248     void ProcessRaiseAboveTargetRegister();
249     void ProcessForceHideChangeRegister();
250     void ProcessWindowDragHotAreaRegister();
251     void ProcessTouchOutsideRegister();
252     void ProcessSessionInfoLockedStateChangeRegister();
253     void ProcessPrepareClosePiPSessionRegister();
254     void ProcessLandscapeMultiWindowRegister();
255     void ProcessContextTransparentRegister();
256     void ProcessKeyboardGravityChangeRegister();
257     void ProcessAdjustKeyboardLayoutRegister();
258     void ProcessLayoutFullScreenChangeRegister();
259     void ProcessDefaultDensityEnabledRegister();
260     void ProcessTitleAndDockHoverShowChangeRegister();
261     void ProcessRestoreMainWindowRegister();
262     void ProcessFrameLayoutFinishRegister();
263     void ProcessRegisterCallback(ListenerFuncType listenerFuncType);
264     void ProcessSetWindowRectAutoSaveRegister();
265     void RegisterUpdateAppUseControlCallback();
266 
267     void ChangeSessionVisibilityWithStatusBar(SessionInfo& info, bool visible);
268     void ChangeSessionVisibilityWithStatusBarInner(std::shared_ptr<SessionInfo> sessionInfo, bool visible);
269     sptr<SceneSession> GenSceneSession(SessionInfo& info);
270     void PendingSessionActivation(SessionInfo& info);
271     void PendingSessionActivationInner(std::shared_ptr<SessionInfo> sessionInfo);
272     void OnSessionStateChange(const SessionState& state);
273     void OnBufferAvailableChange(const bool isBufferAvailable);
274     void OnSessionEvent(uint32_t eventId, const SessionEventParam& param);
275     void OnCreateSubSession(const sptr<SceneSession>& sceneSession);
276     void OnBindDialogTarget(const sptr<SceneSession>& sceneSession);
277     void OnSessionRectChange(const WSRect& rect, const SizeChangeReason& reason = SizeChangeReason::UNDEFINED);
278     void OnSessionPiPControlStatusChange(WsPiPControlType controlType, WsPiPControlStatus status);
279     void OnAutoStartPiPStatusChange(bool isAutoStart, uint32_t priority);
280     void OnRaiseToTop();
281     void OnRaiseToTopForPointDown();
282     void OnRaiseAboveTarget(int32_t subWindowId);
283     void OnBackPressed(bool needMoveToBackground);
284     void OnSessionFocusableChange(bool isFocusable);
285     void OnSessionTouchableChange(bool touchable);
286     void OnSessionTopmostChange(bool topmost);
287     void OnMainWindowTopmostChange(bool isTopmost);
288     void OnSubModalTypeChange(SubWindowModalType subWindowModalType);
289     void OnMainModalTypeChange(bool isModal);
290     void OnClick();
291     void TerminateSession(const SessionInfo& info);
292     void TerminateSessionNew(const SessionInfo& info, bool needStartCaller, bool isFromBroker);
293     void TerminateSessionTotal(const SessionInfo& info, TerminateType terminateType);
294     void UpdateSessionLabel(const std::string& label);
295     void UpdateSessionIcon(const std::string& iconPath);
296     void OnSessionException(const SessionInfo& info, bool needRemoveSession, bool startFail);
297     void OnSystemBarPropertyChange(const std::unordered_map<WindowType, SystemBarProperty>& propertyMap);
298     void OnNeedAvoid(bool status);
299     void PendingSessionToForeground(const SessionInfo& info);
300     void PendingSessionToBackgroundForDelegator(const SessionInfo& info, bool shouldBackToCaller);
301     void OnDefaultAnimationFlagChange(bool isNeedDefaultAnimationFlag);
302     void OnIsCustomAnimationPlaying(bool status);
303     void OnShowWhenLocked(bool showWhenLocked);
304     void OnReuqestedOrientationChange(uint32_t orientation);
305     void OnForceHideChange(bool hide);
306     void OnWindowDragHotArea(uint32_t type, const SizeChangeReason& reason);
307     void OnTouchOutside();
308     void OnSessionInfoLockedStateChange(bool lockedState);
309     void OnPrepareClosePiPSession();
310     void OnContextTransparent();
311     void SetLandscapeMultiWindow(bool isLandscapeMultiWindow);
312     void OnKeyboardGravityChange(SessionGravity gravity);
313     void OnAdjustKeyboardLayout(const KeyboardLayoutParams& params);
314     void OnLayoutFullScreenChange(bool isLayoutFullScreen);
315     void OnDefaultDensityEnabled(bool isDefaultDensityEnabled);
316     void OnTitleAndDockHoverShowChange(bool isTitleHoverShown = true, bool isDockHoverShown = true);
317     void RestoreMainWindow();
318     void NotifyFrameLayoutFinish();
319     void OnSetWindowRectAutoSave(bool enabled);
320     void OnUpdateAppUseControl(ControlAppType type, bool isNeedControl);
321 
322     std::shared_ptr<NativeReference> GetJSCallback(const std::string& functionName);
323 
324     napi_env env_;
325     wptr<SceneSession> weakSession_ = nullptr;
326     int32_t persistentId_ = -1;
327     wptr<SceneSession::SessionChangeCallback> sessionchangeCallback_ = nullptr;
328     std::shared_mutex jsCbMapMutex_;
329     std::map<std::string, std::shared_ptr<NativeReference>> jsCbMap_;
330     std::shared_ptr<MainThreadScheduler> taskScheduler_;
331     static std::map<int32_t, napi_ref> jsSceneSessionMap_;
332 };
333 } // namespace OHOS::Rosen
334 
335 #endif // OHOS_WINDOW_SCENE_JS_SCENE_SESSION_H
336