1 /* 2 * Copyright (c) 2023-2024 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 FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_UI_EXTENSION_UI_EXTENSION_PATTERN_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_UI_EXTENSION_UI_EXTENSION_PATTERN_H 18 19 #include <cstdint> 20 #include <functional> 21 #include <list> 22 #include <memory> 23 #include <optional> 24 #include <refbase.h> 25 #include <vector> 26 27 #include "base/memory/referenced.h" 28 #include "base/want/want_wrap.h" 29 #include "core/common/container.h" 30 #include "core/components_ng/event/gesture_event_hub.h" 31 #include "core/components_ng/pattern/pattern.h" 32 #include "core/components_ng/pattern/ui_extension/session_wrapper.h" 33 #include "core/components_ng/pattern/ui_extension/ui_extension_config.h" 34 #include "core/components_ng/pattern/ui_extension/accessibility_session_adapter_ui_extension.h" 35 #include "core/event/mouse_event.h" 36 #include "core/event/touch_event.h" 37 38 #define UIEXT_LOGD(fmt, ...) \ 39 TAG_LOGD(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "[@%{public}d][ID: %{public}d] " fmt, __LINE__, uiExtensionId_, \ 40 ##__VA_ARGS__) 41 #define UIEXT_LOGI(fmt, ...) \ 42 TAG_LOGI(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "[@%{public}d][ID: %{public}d] " fmt, __LINE__, uiExtensionId_, \ 43 ##__VA_ARGS__) 44 #define UIEXT_LOGW(fmt, ...) \ 45 TAG_LOGW(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "[@%{public}d][ID: %{public}d] " fmt, __LINE__, uiExtensionId_, \ 46 ##__VA_ARGS__) 47 #define UIEXT_LOGE(fmt, ...) \ 48 TAG_LOGE(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "[@%{public}d][ID: %{public}d] " fmt, __LINE__, uiExtensionId_, \ 49 ##__VA_ARGS__) 50 #define UIEXT_LOGF(fmt, ...) \ 51 TAG_LOGF(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "[@%{public}d][ID: %{public}d] " fmt, __LINE__, uiExtensionId_, \ 52 ##__VA_ARGS__) 53 54 namespace OHOS::Accessibility { 55 class AccessibilityElementInfo; 56 class AccessibilityEventInfo; 57 } // namespace OHOS::Accessibility 58 59 namespace OHOS::MMI { 60 class KeyEvent; 61 class PointerEvent; 62 } // namespace OHOS::MMI 63 64 namespace OHOS::Ace { 65 class ModalUIExtensionProxy; 66 } // namespace OHOS::Ace 67 68 namespace OHOS::Rosen { 69 class AvoidArea; 70 class RSTransaction; 71 } // namespace OHOS::Rosen 72 73 namespace OHOS::Ace::NG { 74 using BusinessDataUECConsumeCallback = std::function<int32_t(const AAFwk::Want&)>; 75 using BusinessDataUECConsumeReplyCallback = std::function<int32_t(const AAFwk::Want&, std::optional<AAFwk::Want>&)>; 76 class UIExtensionProxy; 77 class UIExtensionPattern : public Pattern { 78 DECLARE_ACE_TYPE(UIExtensionPattern, Pattern); 79 80 public: 81 explicit UIExtensionPattern(bool isTransferringCaller = false, bool isModal = false, 82 bool isAsyncModalBinding = false, SessionType sessionType = SessionType::UI_EXTENSION_ABILITY); 83 ~UIExtensionPattern() override; 84 85 RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override; 86 FocusPattern GetFocusPattern() const override; 87 RefPtr<AccessibilitySessionAdapter> GetAccessibilitySessionAdapter() override; 88 SetPlaceholderMap(const std::map<PlaceholderType,RefPtr<NG::FrameNode>> & placeholderMap)89 void SetPlaceholderMap(const std::map<PlaceholderType, RefPtr<NG::FrameNode>>& placeholderMap) 90 { 91 placeholderMap_ = placeholderMap; 92 } 93 void UpdateWant(const RefPtr<OHOS::Ace::WantWrap>& wantWrap); 94 void UpdateWant(const AAFwk::Want& want); 95 96 void OnWindowShow() override; 97 void OnWindowHide() override; 98 void OnWindowSizeChanged(int32_t width, int32_t height, WindowSizeChangeReason type) override; 99 void OnVisibleChange(bool visible) override; 100 void OnMountToParentDone() override; 101 void AfterMountToParent() override; 102 void OnSyncGeometryNode(const DirtySwapConfig& config) override; 103 void RegisterWindowSceneVisibleChangeCallback(const RefPtr<Pattern>& windowScenePattern); 104 void UnRegisterWindowSceneVisibleChangeCallback(int32_t nodeId); 105 void OnWindowSceneVisibleChange(bool visible); 106 107 void OnConnect(); 108 void OnDisconnect(bool isAbnormal); 109 void HandleDragEvent(const DragPointerEvent& info) override; 110 111 void SetModalOnDestroy(const std::function<void()>&& callback); 112 void FireModalOnDestroy(); 113 void SetModalOnRemoteReadyCallback( 114 const std::function<void(const std::shared_ptr<ModalUIExtensionProxy>&)>&& callback); 115 void SetOnRemoteReadyCallback(const std::function<void(const RefPtr<UIExtensionProxy>&)>&& callback); 116 void FireOnRemoteReadyCallback(); 117 void SetOnReleaseCallback(const std::function<void(int32_t)>&& callback); 118 void FireOnReleaseCallback(int32_t releaseCode); 119 void SetOnResultCallback(const std::function<void(int32_t, const AAFwk::Want&)>&& callback); 120 void FireOnResultCallback(int32_t code, const AAFwk::Want& want); 121 void SetOnTerminatedCallback(const std::function<void(int32_t, const RefPtr<WantWrap>&)>&& callback); 122 void FireOnTerminatedCallback(int32_t code, const RefPtr<WantWrap>& wantWrap); 123 void SetOnReceiveCallback(const std::function<void(const AAFwk::WantParams&)>&& callback); 124 void FireOnReceiveCallback(const AAFwk::WantParams& params); 125 void SetOnErrorCallback( 126 const std::function<void(int32_t code, const std::string& name, const std::string& message)>&& callback); 127 void FireOnErrorCallback(int32_t code, const std::string& name, const std::string& message); 128 void SetSyncCallbacks(const std::list<std::function<void(const RefPtr<UIExtensionProxy>&)>>&& callbackList); 129 void FireSyncCallbacks(); 130 void SetAsyncCallbacks(const std::list<std::function<void(const RefPtr<UIExtensionProxy>&)>>&& callbackList); 131 void FireAsyncCallbacks(); 132 void SetBindModalCallback(const std::function<void()>&& callback); 133 void FireBindModalCallback(); 134 void DispatchFollowHostDensity(bool densityDpi); 135 void OnDpiConfigurationUpdate() override; 136 void SetDensityDpi(bool densityDpi); 137 bool GetDensityDpi(); 138 bool IsCompatibleOldVersion(); 139 140 void NotifySizeChangeReason( 141 WindowSizeChangeReason type, const std::shared_ptr<Rosen::RSTransaction>& rsTransaction); 142 void NotifyForeground(); 143 void NotifyBackground(bool isHandleError = true); 144 void NotifyDestroy(); 145 int32_t GetInstanceId(); 146 int32_t GetSessionId(); 147 int32_t GetNodeId(); 148 int32_t GetUiExtensionId() override; 149 bool IsModalUec(); 150 bool IsForeground(); GetSessionWrapper()151 RefPtr<SessionWrapper> GetSessionWrapper() 152 { 153 return sessionWrapper_; 154 } 155 int64_t WrapExtensionAbilityId(int64_t extensionOffset, int64_t abilityId) override; 156 void DispatchOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type); 157 void HandleVisibleAreaChange(bool visible, double ratio); 158 void OnExtensionDetachToDisplay(); 159 void SetWantWrap(const RefPtr<OHOS::Ace::WantWrap>& wantWrap); 160 RefPtr<OHOS::Ace::WantWrap> GetWantWrap(); IsShowPlaceholder()161 bool IsShowPlaceholder() 162 { 163 return (curPlaceholderType_ != PlaceholderType::NONE); 164 } IsCanMountPlaceholder(PlaceholderType type)165 bool IsCanMountPlaceholder(PlaceholderType type) 166 { 167 return (static_cast<int32_t>(type) > static_cast<int32_t>(curPlaceholderType_)); 168 } SetCurPlaceholderType(PlaceholderType type)169 void SetCurPlaceholderType(PlaceholderType type) 170 { 171 curPlaceholderType_ = type; 172 } 173 void PostDelayRemovePlaceholder(uint32_t delay); 174 void ReplacePlaceholderByContent(); 175 void OnExtensionEvent(UIExtCallbackEventId eventId); 176 void OnUeaAccessibilityEventAsync(); 177 void OnAreaUpdated(); 178 179 void OnAccessibilityEvent(const Accessibility::AccessibilityEventInfo& info, int64_t uiExtensionOffset); SetModalFlag(bool isModal)180 void SetModalFlag(bool isModal) 181 { 182 isModal_ = isModal; 183 } SetNeedCheckWindowSceneId(bool needCheckWindowSceneId)184 void SetNeedCheckWindowSceneId(bool needCheckWindowSceneId) 185 { 186 needCheckWindowSceneId_ = needCheckWindowSceneId; 187 } 188 void OnAccessibilityChildTreeRegister(uint32_t windowId, int32_t treeId, int64_t accessibilityId); 189 void OnAccessibilityChildTreeDeregister(); 190 void OnSetAccessibilityChildTree(int32_t childWindowId, int32_t childTreeId); 191 void OnAccessibilityDumpChildInfo(const std::vector<std::string>& params, std::vector<std::string>& info); 192 193 void DumpInfo() override; 194 void DumpInfo(std::unique_ptr<JsonValue>& json) override; 195 void DumpOthers(); 196 197 int32_t GetInstanceIdFromHost() const; 198 bool SendBusinessDataSyncReply(UIContentBusinessCode code, AAFwk::Want&& data, AAFwk::Want& reply); 199 bool SendBusinessData(UIContentBusinessCode code, AAFwk::Want&& data, BusinessDataSendType type); 200 void OnUIExtBusinessReceiveReply( 201 UIContentBusinessCode code, const AAFwk::Want& data, std::optional<AAFwk::Want>& reply); 202 void OnUIExtBusinessReceive(UIContentBusinessCode code, const AAFwk::Want& data); 203 void RegisterUIExtBusinessConsumeCallback(UIContentBusinessCode code, BusinessDataUECConsumeCallback callback); 204 void RegisterUIExtBusinessConsumeReplyCallback( 205 UIContentBusinessCode code, BusinessDataUECConsumeReplyCallback callback); 206 207 void TransferAccessibilityRectInfo(); 208 void OnFrameNodeChanged(FrameNodeChangeInfoFlag flag) override; 209 210 protected: 211 virtual void DispatchPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent); 212 virtual void DispatchKeyEvent(const KeyEvent& event); 213 214 int32_t uiExtensionId_ = 0; 215 int32_t instanceId_ = Container::CurrentId(); 216 217 private: 218 enum class AbilityState { 219 NONE = 0, 220 FOREGROUND, 221 BACKGROUND, 222 DESTRUCTION, 223 }; 224 225 struct ErrorMsg { 226 int32_t code = 0; 227 std::string name; 228 std::string message; 229 }; 230 231 const char* ToString(AbilityState state); 232 void OnAttachToFrameNode() override; 233 void OnDetachFromFrameNode(FrameNode* frameNode) override; 234 void OnLanguageConfigurationUpdate() override; 235 void OnColorConfigurationUpdate() override; 236 void OnModifyDone() override; 237 bool CheckConstraint(); 238 239 void InitKeyEvent(const RefPtr<FocusHub>& focusHub); 240 void InitTouchEvent(const RefPtr<GestureEventHub>& gestureHub); 241 void InitMouseEvent(const RefPtr<InputEventHub>& inputHub); 242 void InitHoverEvent(const RefPtr<InputEventHub>& inputHub); 243 void InitializeAccessibility(); 244 bool HandleKeyEvent(const KeyEvent& event); 245 void HandleFocusEvent(); 246 void HandleBlurEvent(); 247 void HandleTouchEvent(const TouchEventInfo& info); 248 void HandleMouseEvent(const MouseInfo& info); 249 void HandleHoverEvent(bool isHover); 250 bool DispatchKeyEventSync(const KeyEvent& event); 251 void DispatchFocusActiveEvent(bool isFocusActive); 252 void DispatchFocusState(bool focusState); 253 void DispatchDisplayArea(bool isForce = false); 254 void LogoutModalUIExtension(); 255 256 void RegisterVisibleAreaChange(); 257 void MountPlaceholderNode(PlaceholderType type); 258 void RemovePlaceholderNode(); SetFoldStatusChanged(bool isChanged)259 void SetFoldStatusChanged(bool isChanged) 260 { 261 isFoldStatusChanged_ = isChanged; 262 } IsFoldStatusChanged()263 bool IsFoldStatusChanged() 264 { 265 return isFoldStatusChanged_; 266 } SetRotateStatusChanged(bool isChanged)267 void SetRotateStatusChanged(bool isChanged) 268 { 269 isRotateStatusChanged_ = isChanged; 270 } IsRotateStatusChanged()271 bool IsRotateStatusChanged() 272 { 273 return isRotateStatusChanged_; 274 } 275 PlaceholderType GetSizeChangeReason(); 276 UIExtensionUsage GetUIExtensionUsage(const AAFwk::Want& want); 277 void ReDispatchDisplayArea(); 278 279 void ResetAccessibilityChildTreeCallback(); 280 281 void UpdateFrameNodeState(); 282 bool IsAncestorNodeGeometryChange(FrameNodeChangeInfoFlag flag); 283 bool IsAncestorNodeTransformChange(FrameNodeChangeInfoFlag flag); 284 AccessibilityParentRectInfo GetAccessibilityRectInfo() const; 285 286 RefPtr<TouchEventImpl> touchEvent_; 287 RefPtr<InputEvent> mouseEvent_; 288 RefPtr<InputEvent> hoverEvent_; 289 std::shared_ptr<MMI::PointerEvent> lastPointerEvent_ = nullptr; 290 std::shared_ptr<AccessibilityChildTreeCallback> accessibilityChildTreeCallback_; 291 292 std::function<void()> onModalDestroy_; 293 std::function<void(const std::shared_ptr<ModalUIExtensionProxy>&)> onModalRemoteReadyCallback_; 294 std::function<void(const RefPtr<UIExtensionProxy>&)> onRemoteReadyCallback_; 295 std::function<void(int32_t)> onReleaseCallback_; 296 std::function<void(int32_t, const AAFwk::Want&)> onResultCallback_; 297 std::function<void(int32_t, const RefPtr<WantWrap>&)> onTerminatedCallback_; 298 std::function<void(const AAFwk::WantParams&)> onReceiveCallback_; 299 std::function<void(int32_t code, const std::string& name, const std::string& message)> onErrorCallback_; 300 std::list<std::function<void(const RefPtr<UIExtensionProxy>&)>> onSyncOnCallbackList_; 301 std::list<std::function<void(const RefPtr<UIExtensionProxy>&)>> onAsyncOnCallbackList_; 302 std::function<void()> bindModalCallback_; 303 std::map<PlaceholderType, RefPtr<NG::FrameNode>> placeholderMap_; 304 305 RefPtr<OHOS::Ace::WantWrap> curWant_; 306 RefPtr<FrameNode> contentNode_; 307 RefPtr<SessionWrapper> sessionWrapper_; 308 RefPtr<AccessibilitySessionAdapterUIExtension> accessibilitySessionAdapter_; 309 ErrorMsg lastError_; 310 AbilityState state_ = AbilityState::NONE; 311 bool isTransferringCaller_ = false; 312 bool isVisible_ = true; 313 bool isModal_ = false; 314 bool isAsyncModalBinding_ = false; 315 PlaceholderType curPlaceholderType_ = PlaceholderType::NONE; 316 bool isFoldStatusChanged_ = false; 317 bool isRotateStatusChanged_ = false; 318 bool densityDpi_ = false; 319 WeakPtr<Pattern> weakSystemWindowScene_; 320 // Whether to send the focus to the UIExtension 321 // No multi-threading problem due to run js thread 322 bool canFocusSendToUIExtension_ = true; 323 bool needReSendFocusToUIExtension_ = false; 324 int32_t surfacePositionCallBackId_ = -1; 325 int32_t foldDisplayCallBackId_ = -1; 326 RectF displayArea_; 327 bool isKeyAsync_ = false; 328 // StartUIExtension should after mountToParent 329 bool hasMountToParent_ = false; 330 bool needReNotifyForeground_ = false; 331 bool needCheckWindowSceneId_ = false; 332 bool needReDispatchDisplayArea_ = false; 333 bool curVisible_ = false; 334 SessionType sessionType_ = SessionType::UI_EXTENSION_ABILITY; 335 UIExtensionUsage usage_ = UIExtensionUsage::EMBEDDED; 336 337 // UEC dump info 338 bool focusState_ = false; 339 uint32_t focusWindowId_ = 0; 340 uint32_t realHostWindowId_ = 0; 341 std::string want_; 342 std::map<UIContentBusinessCode, BusinessDataUECConsumeCallback> businessDataUECConsumeCallbacks_; 343 std::map<UIContentBusinessCode, BusinessDataUECConsumeReplyCallback> businessDataUECConsumeReplyCallbacks_; 344 345 std::shared_ptr<AccessibilitySAObserverCallback> accessibilitySAObserverCallback_; 346 347 ACE_DISALLOW_COPY_AND_MOVE(UIExtensionPattern); 348 }; 349 } // namespace OHOS::Ace::NG 350 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_UI_EXTENSION_UI_EXTENSION_PATTERN_H 351