• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_UI_EXTENSION_UI_EXTENSION_MANAGER_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_UI_EXTENSION_UI_EXTENSION_MANAGER_H
18 
19 #include <bitset>
20 #include <memory>
21 #include <mutex>
22 
23 #include "base/memory/ace_type.h"
24 #include "base/memory/referenced.h"
25 #include "base/want/want_wrap.h"
26 #include "core/common/container.h"
27 #include "core/components_ng/pattern/ui_extension/session_wrapper.h"
28 #include "core/components_ng/pattern/ui_extension/ui_extension_pattern.h"
29 
30 namespace OHOS {
31 template<typename T>
32 class sptr;
33 namespace Rosen {
34 class AvoidArea;
35 enum class WSError;
36 class OccupiedAreaChangeInfo;
37 } // namespace Rosen
38 } // namespace OHOS
39 
40 namespace OHOS::Ace::NG {
41 namespace {
42 constexpr int32_t UI_EXTENSION_UNKNOW_ID = 0;
43 constexpr int32_t UI_EXTENSION_ID_FIRST_MAX = 10;
44 constexpr int32_t UI_EXTENSION_ID_OTHER_MAX = 9;
45 constexpr int64_t UI_EXTENSION_OFFSET_MAX = 100000000000;
46 constexpr int64_t UI_EXTENSION_OFFSET_MIN = 10000000000;
47 constexpr int32_t UI_EXTENSION_ID_FACTOR = 10;
48 constexpr int32_t UI_EXTENSION_LEVEL_MAX = 3;
49 constexpr int32_t UI_EXTENSION_ROOT_ID = -1;
50 using UIExtBusinessDataSendCallback = std::function<std::optional<AAFwk::Want>(WeakPtr<UIExtensionPattern>)>;
51 using UIExtBusinessDataConsumeCallback = std::function<int32_t(const AAFwk::Want&)>;
52 using UIExtBusinessDataConsumeReplyCallback = std::function<int32_t(const AAFwk::Want&, std::optional<AAFwk::Want>&)>;
53 
54 using UIExtBusinessSendToHostReplyFunc = std::function<bool(uint32_t, AAFwk::Want&&, AAFwk::Want&)>;
55 using UIExtBusinessSendToHostFunc = std::function<bool(uint32_t, AAFwk::Want&&, BusinessDataSendType)>;
56 
57 }; // namespace
58 
59 class UIExtensionPattern;
60 class SecurityUIExtensionPattern;
61 class ACE_FORCE_EXPORT UIExtensionIdUtility : public Singleton<UIExtensionIdUtility> {
62     DECLARE_SINGLETON(UIExtensionIdUtility);
63 public:
64     int32_t ApplyExtensionId();
65     void RecycleExtensionId(int32_t id);
66 
67 private:
68     std::bitset<UI_EXTENSION_ID_FIRST_MAX> idPool_;
69     std::mutex poolMutex_;
70 };
71 
72 class UIExtensionManager : public AceType {
73     DECLARE_ACE_TYPE(UIExtensionManager, AceType);
74 
75 public:
76     UIExtensionManager() = default;
77     ~UIExtensionManager() override = default;
78 
79     void RegisterUIExtensionInFocus(
80         const WeakPtr<UIExtensionPattern>& uiExtensionFocused, const WeakPtr<SessionWrapper>& sessionWrapper);
81     bool OnBackPressed();
82     const RefPtr<FrameNode> GetFocusUiExtensionNode();
83     bool IsWrapExtensionAbilityId(int64_t elementId);
84     bool SendAccessibilityEventInfo(const Accessibility::AccessibilityEventInfo& eventInfo, int64_t uiExtensionOffset,
85         const RefPtr<PipelineBase>& pipeline);
86     std::pair<int64_t, int64_t> UnWrapExtensionAbilityId(int64_t extensionOffset, int64_t elementId);
87     int32_t ApplyExtensionId();
88     void RecycleExtensionId(int32_t id);
89     void RegisterSecurityUIExtensionInFocus(
90         const WeakPtr<SecurityUIExtensionPattern>& uiExtensionFocused,
91         const WeakPtr<SessionWrapper>& sessionWrapper);
92 
93     /**
94      * @brief Create a UIExtensionComponent object on the page and save it in the UIExtension management object
95      *
96      * @param uiExtension The UIExtensionComponent pattern object
97      */
98     void AddAliveUIExtension(int32_t nodeId, const WeakPtr<UIExtensionPattern>& uiExtension);
99 
100     /**
101      * @brief Clear the UIExtensionComponent to be destroyed
102      *
103      * @param nodeId The UIExtensionComponent Id
104      */
105     void RemoveDestroyedUIExtension(int32_t nodeId);
106 
107     /**
108      * @brief Check whether UIExtensionComponent Node is showing placeholder
109      *
110      * @param nodeId The UIExtensionComponent Id
111      */
112     bool IsShowPlaceholder(int32_t nodeId);
113 
114     /**
115      * @brief Transfer the original avoid area and avoid area type to the UIExtensionAbility
116      *
117      * @param avoidArea The original avoid area
118      * @param type The original aovid areatype
119      */
120     void TransferOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type);
121 
122     bool NotifyOccupiedAreaChangeInfo(const sptr<Rosen::OccupiedAreaChangeInfo>& info);
123 
124     bool HandleUnfocusedModalUecBackPressed();
125 
126     bool IsLastModalUec(const RefPtr<FrameNode>& frameNode);
127 
128     void NotifySizeChangeReason(
129         WindowSizeChangeReason type, const std::shared_ptr<Rosen::RSTransaction>& rsTransaction);
130 
131     void AddAliveUIExtension(int32_t nodeId, const WeakPtr<SecurityUIExtensionPattern>& uiExtension);
132 
133     void DumpUIExt();
134 
135     // host send data to provider
136     void RegisterBusinessDataSendCallback(
137             UIContentBusinessCode code, BusinessDataSendType type, UIExtBusinessDataSendCallback callback);
138     bool TriggerBusinessDataSend(UIContentBusinessCode code);
139 
140     // provider consume data
141     void RegisterBusinessDataConsumeReplyCallback(
142             UIContentBusinessCode code, UIExtBusinessDataConsumeReplyCallback callback);
143     void DispatchBusinessDataConsumeReply(
144         UIContentBusinessCode code, const AAFwk::Want& data, std::optional<AAFwk::Want>& reply);
145 
146     void RegisterBusinessDataConsumeCallback(UIContentBusinessCode code, UIExtBusinessDataConsumeCallback callback);
147     void DispatchBusinessDataConsume(UIContentBusinessCode code, const AAFwk::Want& data);
148 
149     // provider send data to host
150     void RegisterBusinessSendToHostReply(UIExtBusinessSendToHostReplyFunc func);
151     void RegisterBusinessSendToHost(UIExtBusinessSendToHostFunc func);
152     bool SendBusinessToHost(UIContentBusinessCode code, AAFwk::Want&& data, BusinessDataSendType type);
153     bool SendBusinessToHostSyncReply(UIContentBusinessCode code, AAFwk::Want&& data, AAFwk::Want& reply);
154 
155     void TransferAccessibilityRectInfo();
156 private:
157     bool UIExtBusinessDataSendValid();
158     WeakPtr<UIExtensionPattern> uiExtensionFocused_;
159     WeakPtr<SecurityUIExtensionPattern> securityUiExtensionFocused_;
160     WeakPtr<SessionWrapper> sessionWrapper_;
161     std::mutex aliveUIExtensionMutex_;
162     std::map<int32_t, OHOS::Ace::WeakPtr<UIExtensionPattern>> aliveUIExtensions_;
163     std::map<int32_t, OHOS::Ace::WeakPtr<SecurityUIExtensionPattern>> aliveSecurityUIExtensions_;
164     std::map<UIContentBusinessCode,
165         std::pair<BusinessDataSendType, UIExtBusinessDataSendCallback>> businessDataSendCallbacks_;
166     std::map<UIContentBusinessCode, UIExtBusinessDataConsumeCallback> businessDataConsumeCallbacks_;
167     std::map<UIContentBusinessCode, UIExtBusinessDataConsumeReplyCallback> businessDataConsumeReplyCallbacks_;
168     UIExtBusinessSendToHostReplyFunc businessSendToHostReplyFunc_;
169     UIExtBusinessSendToHostFunc businessSendToHostFunc_;
170 };
171 } // namespace OHOS::Ace::NG
172 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_UI_EXTENSION_UI_EXTENSION_MANAGER_H
173