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/accessibility_session_adapter_ui_extension.h" 34 #include "core/event/mouse_event.h" 35 #include "core/event/touch_event.h" 36 37 #define UIEXT_LOGD(fmt, ...) \ 38 TAG_LOGD(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "[@%{public}d][ID: %{public}d] " fmt, __LINE__, uiExtensionId_, \ 39 ##__VA_ARGS__) 40 #define UIEXT_LOGI(fmt, ...) \ 41 TAG_LOGI(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "[@%{public}d][ID: %{public}d] " fmt, __LINE__, uiExtensionId_, \ 42 ##__VA_ARGS__) 43 #define UIEXT_LOGW(fmt, ...) \ 44 TAG_LOGW(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "[@%{public}d][ID: %{public}d] " fmt, __LINE__, uiExtensionId_, \ 45 ##__VA_ARGS__) 46 #define UIEXT_LOGE(fmt, ...) \ 47 TAG_LOGE(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "[@%{public}d][ID: %{public}d] " fmt, __LINE__, uiExtensionId_, \ 48 ##__VA_ARGS__) 49 #define UIEXT_LOGF(fmt, ...) \ 50 TAG_LOGF(AceLogTag::ACE_UIEXTENSIONCOMPONENT, "[@%{public}d][ID: %{public}d] " fmt, __LINE__, uiExtensionId_, \ 51 ##__VA_ARGS__) 52 53 namespace OHOS::Accessibility { 54 class AccessibilityElementInfo; 55 class AccessibilityEventInfo; 56 } // namespace OHOS::Accessibility 57 58 namespace OHOS::MMI { 59 class KeyEvent; 60 class PointerEvent; 61 } // namespace OHOS::MMI 62 63 namespace OHOS::Ace { 64 class ModalUIExtensionProxy; 65 } // namespace OHOS::Ace 66 67 namespace OHOS::Rosen { 68 class AvoidArea; 69 class RSTransaction; 70 } // namespace OHOS::Rosen 71 72 namespace OHOS::Ace::NG { 73 class UIExtensionProxy; 74 class UIExtensionPattern : public Pattern { 75 DECLARE_ACE_TYPE(UIExtensionPattern, Pattern); 76 77 public: 78 explicit UIExtensionPattern(bool isTransferringCaller = false, bool isModal = false, 79 bool isAsyncModalBinding = false, SessionType sessionType = SessionType::UI_EXTENSION_ABILITY); 80 ~UIExtensionPattern() override; 81 82 RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override; 83 FocusPattern GetFocusPattern() const override; 84 RefPtr<AccessibilitySessionAdapter> GetAccessibilitySessionAdapter() override; 85 SetPlaceholderNode(const RefPtr<FrameNode> & placeholderNode)86 void SetPlaceholderNode(const RefPtr<FrameNode>& placeholderNode) 87 { 88 placeholderNode_ = placeholderNode; 89 } 90 void UpdateWant(const RefPtr<OHOS::Ace::WantWrap>& wantWrap); 91 void UpdateWant(const AAFwk::Want& want); 92 93 void OnWindowShow() override; 94 void OnWindowHide() override; 95 void OnVisibleChange(bool visible) override; 96 void OnMountToParentDone() override; 97 void AfterMountToParent() override; 98 void OnSyncGeometryNode(const DirtySwapConfig& config) override; 99 100 void OnConnect(); 101 void OnDisconnect(bool isAbnormal); 102 void HandleDragEvent(const PointerEvent& info) override; 103 104 void SetModalOnDestroy(const std::function<void()>&& callback); 105 void FireModalOnDestroy(); 106 void SetModalOnRemoteReadyCallback( 107 const std::function<void(const std::shared_ptr<ModalUIExtensionProxy>&)>&& callback); 108 void SetOnRemoteReadyCallback(const std::function<void(const RefPtr<UIExtensionProxy>&)>&& callback); 109 void FireOnRemoteReadyCallback(); 110 void SetOnReleaseCallback(const std::function<void(int32_t)>&& callback); 111 void FireOnReleaseCallback(int32_t releaseCode); 112 void SetOnResultCallback(const std::function<void(int32_t, const AAFwk::Want&)>&& callback); 113 void FireOnResultCallback(int32_t code, const AAFwk::Want& want); 114 void SetOnTerminatedCallback(const std::function<void(int32_t, const RefPtr<WantWrap>&)>&& callback); 115 void FireOnTerminatedCallback(int32_t code, const RefPtr<WantWrap>& wantWrap); 116 void SetOnReceiveCallback(const std::function<void(const AAFwk::WantParams&)>&& callback); 117 void FireOnReceiveCallback(const AAFwk::WantParams& params); 118 void SetOnErrorCallback( 119 const std::function<void(int32_t code, const std::string& name, const std::string& message)>&& callback); 120 void FireOnErrorCallback(int32_t code, const std::string& name, const std::string& message); 121 void SetSyncCallbacks(const std::list<std::function<void(const RefPtr<UIExtensionProxy>&)>>&& callbackList); 122 void FireSyncCallbacks(); 123 void SetAsyncCallbacks(const std::list<std::function<void(const RefPtr<UIExtensionProxy>&)>>&& callbackList); 124 void FireAsyncCallbacks(); 125 void SetBindModalCallback(const std::function<void()>&& callback); 126 void FireBindModalCallback(); 127 void DispatchFollowHostDensity(bool densityDpi); 128 void OnDpiConfigurationUpdate() override; 129 void SetDensityDpi(bool densityDpi); 130 bool GetDensityDpi(); 131 bool IsCompatibleOldVersion(); 132 133 void NotifySizeChangeReason( 134 WindowSizeChangeReason type, const std::shared_ptr<Rosen::RSTransaction>& rsTransaction); 135 void NotifyForeground(); 136 void NotifyBackground(); 137 void NotifyDestroy(); 138 int32_t GetInstanceId(); 139 int32_t GetSessionId(); 140 int32_t GetNodeId(); 141 int32_t GetUiExtensionId() override; 142 bool IsModalUec(); 143 bool IsForeground(); GetSessionWrapper()144 RefPtr<SessionWrapper> GetSessionWrapper() 145 { 146 return sessionWrapper_; 147 } 148 int64_t WrapExtensionAbilityId(int64_t extensionOffset, int64_t abilityId) override; 149 void DispatchOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type); 150 void HandleVisibleAreaChange(bool visible, double ratio); 151 void SetWantWrap(const RefPtr<OHOS::Ace::WantWrap>& wantWrap); 152 RefPtr<OHOS::Ace::WantWrap> GetWantWrap(); IsShowPlaceholder()153 bool IsShowPlaceholder() 154 { 155 return isShowPlaceholder_; 156 } 157 158 void OnAccessibilityEvent(const Accessibility::AccessibilityEventInfo& info, int64_t uiExtensionOffset); SetModalFlag(bool isModal)159 void SetModalFlag(bool isModal) 160 { 161 isModal_ = isModal; 162 } SetNeedCheckWindowSceneId(bool needCheckWindowSceneId)163 void SetNeedCheckWindowSceneId(bool needCheckWindowSceneId) 164 { 165 needCheckWindowSceneId_ = needCheckWindowSceneId; 166 } 167 void OnAccessibilityChildTreeRegister(uint32_t windowId, int32_t treeId, int64_t accessibilityId); 168 void OnAccessibilityChildTreeDeregister(); 169 void OnSetAccessibilityChildTree(int32_t childWindowId, int32_t childTreeId); 170 void OnAccessibilityDumpChildInfo(const std::vector<std::string>& params, std::vector<std::string>& info); 171 172 protected: 173 virtual void DispatchPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent); 174 virtual void DispatchKeyEvent(const KeyEvent& event); 175 176 int32_t uiExtensionId_ = 0; 177 int32_t instanceId_ = Container::CurrentId(); 178 179 private: 180 enum class AbilityState { 181 NONE = 0, 182 FOREGROUND, 183 BACKGROUND, 184 DESTRUCTION, 185 }; 186 187 struct ErrorMsg { 188 int32_t code = 0; 189 std::string name; 190 std::string message; 191 }; 192 193 const char* ToString(AbilityState state); 194 void OnAttachToFrameNode() override; 195 void OnDetachFromFrameNode(FrameNode* frameNode) override; 196 void OnLanguageConfigurationUpdate() override; 197 void OnColorConfigurationUpdate() override; 198 void OnModifyDone() override; 199 bool CheckConstraint(); 200 201 void InitKeyEvent(const RefPtr<FocusHub>& focusHub); 202 void InitTouchEvent(const RefPtr<GestureEventHub>& gestureHub); 203 void InitMouseEvent(const RefPtr<InputEventHub>& inputHub); 204 void InitHoverEvent(const RefPtr<InputEventHub>& inputHub); 205 void InitializeAccessibility(); 206 bool HandleKeyEvent(const KeyEvent& event); 207 void HandleFocusEvent(); 208 void HandleBlurEvent(); 209 void HandleTouchEvent(const TouchEventInfo& info); 210 void HandleMouseEvent(const MouseInfo& info); 211 void HandleHoverEvent(bool isHover); 212 bool DispatchKeyEventSync(const KeyEvent& event); 213 void DispatchFocusActiveEvent(bool isFocusActive); 214 void DispatchFocusState(bool focusState); 215 void DispatchDisplayArea(bool isForce = false); 216 void LogoutModalUIExtension(); 217 218 void RegisterVisibleAreaChange(); 219 void MountPlaceholderNode(); 220 void RemovePlaceholderNode(); 221 UIExtensionUsage GetUIExtensionUsage(const AAFwk::Want& want); 222 void ReDispatchDisplayArea(); 223 int32_t GetInstanceIdFromHost(); 224 void ResetAccessibilityChildTreeCallback(); 225 226 RefPtr<TouchEventImpl> touchEvent_; 227 RefPtr<InputEvent> mouseEvent_; 228 RefPtr<InputEvent> hoverEvent_; 229 std::shared_ptr<MMI::PointerEvent> lastPointerEvent_ = nullptr; 230 std::shared_ptr<AccessibilityChildTreeCallback> accessibilityChildTreeCallback_; 231 232 std::function<void()> onModalDestroy_; 233 std::function<void(const std::shared_ptr<ModalUIExtensionProxy>&)> onModalRemoteReadyCallback_; 234 std::function<void(const RefPtr<UIExtensionProxy>&)> onRemoteReadyCallback_; 235 std::function<void(int32_t)> onReleaseCallback_; 236 std::function<void(int32_t, const AAFwk::Want&)> onResultCallback_; 237 std::function<void(int32_t, const RefPtr<WantWrap>&)> onTerminatedCallback_; 238 std::function<void(const AAFwk::WantParams&)> onReceiveCallback_; 239 std::function<void(int32_t code, const std::string& name, const std::string& message)> onErrorCallback_; 240 std::list<std::function<void(const RefPtr<UIExtensionProxy>&)>> onSyncOnCallbackList_; 241 std::list<std::function<void(const RefPtr<UIExtensionProxy>&)>> onAsyncOnCallbackList_; 242 std::function<void()> bindModalCallback_; 243 RefPtr<FrameNode> placeholderNode_ = nullptr; 244 245 RefPtr<OHOS::Ace::WantWrap> curWant_; 246 RefPtr<FrameNode> contentNode_; 247 RefPtr<SessionWrapper> sessionWrapper_; 248 RefPtr<AccessibilitySessionAdapterUIExtension> accessibilitySessionAdapter_; 249 ErrorMsg lastError_; 250 AbilityState state_ = AbilityState::NONE; 251 bool isTransferringCaller_ = false; 252 bool isVisible_ = true; 253 bool isModal_ = false; 254 bool isAsyncModalBinding_ = false; 255 bool isShowPlaceholder_ = false; 256 bool densityDpi_ = false; 257 // Whether to send the focus to the UIExtension 258 // No multi-threading problem due to run js thread 259 bool canFocusSendToUIExtension_ = true; 260 bool needReSendFocusToUIExtension_ = false; 261 bool curVisible_ = false; 262 int32_t callbackId_ = 0; 263 RectF displayArea_; 264 bool isKeyAsync_ = false; 265 // StartUIExtension should after mountToParent 266 bool hasMountToParent_ = false; 267 bool needReNotifyForeground_ = false; 268 bool needCheckWindowSceneId_ = false; 269 bool needReDispatchDisplayArea_ = false; 270 SessionType sessionType_ = SessionType::UI_EXTENSION_ABILITY; 271 UIExtensionUsage usage_ = UIExtensionUsage::EMBEDDED; 272 273 ACE_DISALLOW_COPY_AND_MOVE(UIExtensionPattern); 274 }; 275 } // namespace OHOS::Ace::NG 276 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_UI_EXTENSION_UI_EXTENSION_PATTERN_H 277