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