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