• 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/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