• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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