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