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 #include "core/components_ng/pattern/ui_extension/ui_extension_manager.h"
17
18 #include "adapter/ohos/entrance/ace_container.h"
19 #include "core/components_ng/pattern/ui_extension/ui_extension_pattern.h"
20
21 namespace OHOS::Ace::NG {
22 std::bitset<UI_EXTENSION_ID_FIRST_MAX> UIExtensionManager::UIExtensionIdUtility::idPool_;
23 std::mutex UIExtensionManager::UIExtensionIdUtility::poolMutex_;
ApplyExtensionId()24 int32_t UIExtensionManager::UIExtensionIdUtility::ApplyExtensionId()
25 {
26 std::lock_guard<std::mutex> poolMutex(UIExtensionManager::UIExtensionIdUtility::poolMutex_);
27 for (int32_t index = 0; index < UI_EXTENSION_ID_FIRST_MAX; index++) {
28 if (!UIExtensionManager::UIExtensionIdUtility::idPool_.test(index)) {
29 UIExtensionManager::UIExtensionIdUtility::idPool_.set(index, 1);
30 return index + 1;
31 }
32 }
33 return UI_EXTENSION_UNKNOW_ID;
34 }
35
RecycleExtensionId(int32_t id)36 void UIExtensionManager::UIExtensionIdUtility::RecycleExtensionId(int32_t id)
37 {
38 std::lock_guard<std::mutex> poolMutex(UIExtensionManager::UIExtensionIdUtility::poolMutex_);
39 if ((id > UI_EXTENSION_UNKNOW_ID) && (id <= UI_EXTENSION_ID_FIRST_MAX)) {
40 UIExtensionManager::UIExtensionIdUtility::idPool_.set(id - 1, 0);
41 }
42 }
43
RegisterUIExtensionInFocus(const WeakPtr<UIExtensionPattern> & uiExtensionFocused,const WeakPtr<SessionWrapper> & sessionWrapper)44 void UIExtensionManager::RegisterUIExtensionInFocus(
45 const WeakPtr<UIExtensionPattern>& uiExtensionFocused, const WeakPtr<SessionWrapper>& sessionWrapper)
46 {
47 uiExtensionFocused_ = uiExtensionFocused;
48 sessionWrapper_ = sessionWrapper;
49 }
50
OnBackPressed()51 bool UIExtensionManager::OnBackPressed()
52 {
53 auto sessionWrapper = sessionWrapper_.Upgrade();
54 return sessionWrapper && sessionWrapper->NotifyBackPressedSync();
55 }
56
IsWrapExtensionAbilityId(int64_t elementId)57 bool UIExtensionManager::IsWrapExtensionAbilityId(int64_t elementId)
58 {
59 return elementId > UI_EXTENSION_OFFSET_MIN;
60 }
61
IsWindowTypeUIExtension(const RefPtr<PipelineBase> & pipeline)62 bool UIExtensionManager::IsWindowTypeUIExtension(const RefPtr<PipelineBase>& pipeline)
63 {
64 auto instanceId = pipeline->GetInstanceId();
65 auto window = Platform::AceContainer::GetUIWindow(instanceId);
66 CHECK_NULL_RETURN(window, false);
67 return window->GetType() == OHOS::Rosen::WindowType::WINDOW_TYPE_UI_EXTENSION;
68 }
69
SendAccessibilityEventInfo(const Accessibility::AccessibilityEventInfo & eventInfo,int64_t uiExtensionOffset,const RefPtr<PipelineBase> & pipeline)70 bool UIExtensionManager::SendAccessibilityEventInfo(const Accessibility::AccessibilityEventInfo& eventInfo,
71 int64_t uiExtensionOffset, const RefPtr<PipelineBase>& pipeline)
72 {
73 CHECK_NULL_RETURN(pipeline, false);
74 auto instanceId = pipeline->GetInstanceId();
75 auto window = Platform::AceContainer::GetUIWindow(instanceId);
76 CHECK_NULL_RETURN(window, false);
77 OHOS::Rosen::WMError ret = window->TransferAccessibilityEvent(eventInfo, uiExtensionOffset);
78 return ret == OHOS::Rosen::WMError::WM_OK;
79 }
80
UnWrapExtensionAbilityId(int64_t extensionOffset,int64_t elementId)81 std::pair<int64_t, int64_t> UIExtensionManager::UnWrapExtensionAbilityId(int64_t extensionOffset, int64_t elementId)
82 {
83 if (extensionOffset == 0) {
84 return std::pair<int64_t, int64_t>(0, 0);
85 }
86 int64_t index = elementId / extensionOffset;
87 int64_t abilityId = elementId % extensionOffset;
88 return std::pair<int64_t, int64_t>(index, abilityId);
89 }
90
GetFocusUiExtensionNode()91 const RefPtr<FrameNode> UIExtensionManager::GetFocusUiExtensionNode()
92 {
93 auto uiExtensionFocused = uiExtensionFocused_.Upgrade();
94 CHECK_NULL_RETURN(uiExtensionFocused, nullptr);
95 return uiExtensionFocused->GetHost();
96 }
97
ApplyExtensionId()98 int32_t UIExtensionManager::ApplyExtensionId()
99 {
100 CHECK_NULL_RETURN(extensionIdUtility_, UI_EXTENSION_UNKNOW_ID);
101 return extensionIdUtility_->ApplyExtensionId();
102 }
103
RecycleExtensionId(int32_t id)104 void UIExtensionManager::RecycleExtensionId(int32_t id)
105 {
106 CHECK_NULL_VOID(extensionIdUtility_);
107 extensionIdUtility_->RecycleExtensionId(id);
108 }
109
AddAliveUIExtension(int32_t nodeId,const WeakPtr<UIExtensionPattern> & uiExtension)110 void UIExtensionManager::AddAliveUIExtension(int32_t nodeId, const WeakPtr<UIExtensionPattern>& uiExtension)
111 {
112 aliveUIExtensions_.try_emplace(nodeId, uiExtension);
113 }
114
TransferOriginAvoidArea(const Rosen::AvoidArea & avoidArea,uint32_t type)115 void UIExtensionManager::TransferOriginAvoidArea(const Rosen::AvoidArea& avoidArea, uint32_t type)
116 {
117 for (const auto& it : aliveUIExtensions_) {
118 auto uiExtension = it.second.Upgrade();
119 if (uiExtension) {
120 uiExtension->DispatchOriginAvoidArea(avoidArea, type);
121 }
122 }
123 }
124
RemoveDestroyedUIExtension(int32_t nodeId)125 void UIExtensionManager::RemoveDestroyedUIExtension(int32_t nodeId)
126 {
127 auto it = aliveUIExtensions_.find(nodeId);
128 if (it != aliveUIExtensions_.end()) {
129 aliveUIExtensions_.erase(nodeId);
130 }
131 }
132
NotifyOccupiedAreaChangeInfo(const sptr<Rosen::OccupiedAreaChangeInfo> & info)133 bool UIExtensionManager::NotifyOccupiedAreaChangeInfo(const sptr<Rosen::OccupiedAreaChangeInfo>& info)
134 {
135 auto sessionWrapper = sessionWrapper_.Upgrade();
136 return sessionWrapper && sessionWrapper->NotifyOccupiedAreaChangeInfo(info);
137 }
138 } // namespace OHOS::Ace::NG
139