1a69a01cdSopenharmony_ci/* 2a69a01cdSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3a69a01cdSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4a69a01cdSopenharmony_ci * you may not use this file except in compliance with the License. 5a69a01cdSopenharmony_ci * You may obtain a copy of the License at 6a69a01cdSopenharmony_ci * 7a69a01cdSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8a69a01cdSopenharmony_ci * 9a69a01cdSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10a69a01cdSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11a69a01cdSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12a69a01cdSopenharmony_ci * See the License for the specific language governing permissions and 13a69a01cdSopenharmony_ci * limitations under the License. 14a69a01cdSopenharmony_ci */ 15a69a01cdSopenharmony_ci 16a69a01cdSopenharmony_ci#ifndef TEST_WUKONG_TREE_MANAGER_H 17a69a01cdSopenharmony_ci#define TEST_WUKONG_TREE_MANAGER_H 18a69a01cdSopenharmony_ci 19a69a01cdSopenharmony_ci#include "ability_tree.h" 20a69a01cdSopenharmony_ci#include "accessibility_element_info.h" 21a69a01cdSopenharmony_ci#include "component_tree.h" 22a69a01cdSopenharmony_ci#include "page_tree.h" 23a69a01cdSopenharmony_ci#include "wukong_util.h" 24a69a01cdSopenharmony_ci 25a69a01cdSopenharmony_cinamespace OHOS { 26a69a01cdSopenharmony_cinamespace WuKong { 27a69a01cdSopenharmony_cinamespace { 28a69a01cdSopenharmony_ciconst uint32_t INVALIDED_INPUT_INDEX = 0xFFFFFFFF; 29a69a01cdSopenharmony_ciconst uint32_t FOCUS_NUM_DEFAULT = 20; 30a69a01cdSopenharmony_ci} 31a69a01cdSopenharmony_ci/** 32a69a01cdSopenharmony_ci * @brief Generate component tree, get AccessibilityElementInfo for current active components. 33a69a01cdSopenharmony_ci */ 34a69a01cdSopenharmony_ciclass TreeManager : public DelayedSingleton<TreeManager> { 35a69a01cdSopenharmony_ci /** 36a69a01cdSopenharmony_ci * for test flow to get and set test element info. 37a69a01cdSopenharmony_ci */ 38a69a01cdSopenharmony_cipublic: 39a69a01cdSopenharmony_ci /** 40a69a01cdSopenharmony_ci * @brief init and clear container. 41a69a01cdSopenharmony_ci */ 42a69a01cdSopenharmony_ci void InitContainer() 43a69a01cdSopenharmony_ci { 44a69a01cdSopenharmony_ci elementInfoList_.clear(); 45a69a01cdSopenharmony_ci abilityTreeList_.clear(); 46a69a01cdSopenharmony_ci pageTreeList_.clear(); 47a69a01cdSopenharmony_ci componentTreeList_.clear(); 48a69a01cdSopenharmony_ci } 49a69a01cdSopenharmony_ci 50a69a01cdSopenharmony_ci /** 51a69a01cdSopenharmony_ci * @brief Reestablish accessible connections. 52a69a01cdSopenharmony_ci */ 53a69a01cdSopenharmony_ci void ReconnectAccessibility(); 54a69a01cdSopenharmony_ci 55a69a01cdSopenharmony_ci /** 56a69a01cdSopenharmony_ci * @brief update wukong tree by AccessibilityUITestAbility. 57a69a01cdSopenharmony_ci * @return An AccessibilityElementInfo 58a69a01cdSopenharmony_ci */ 59a69a01cdSopenharmony_ci ErrCode UpdateComponentInfo(); 60a69a01cdSopenharmony_ci 61a69a01cdSopenharmony_ci /** 62a69a01cdSopenharmony_ci * @brief get AccessibilityElementInfo for the Preorder Traversal Algorithms. 63a69a01cdSopenharmony_ci * @return An AccessibilityElementInfo 64a69a01cdSopenharmony_ci */ 65a69a01cdSopenharmony_ci const std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo>& GetElementInfoByOrder() 66a69a01cdSopenharmony_ci { 67a69a01cdSopenharmony_ci return inputElementInfo_; 68a69a01cdSopenharmony_ci } 69a69a01cdSopenharmony_ci 70a69a01cdSopenharmony_ci /** 71a69a01cdSopenharmony_ci * @brief get AccessibilityElementInfo list of active component. 72a69a01cdSopenharmony_ci * @return input AccessibilityElementInfo list 73a69a01cdSopenharmony_ci */ 74a69a01cdSopenharmony_ci const std::vector<std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo>>& GetActiveElementInfos() 75a69a01cdSopenharmony_ci { 76a69a01cdSopenharmony_ci return inputElementInfoList_; 77a69a01cdSopenharmony_ci } 78a69a01cdSopenharmony_ci 79a69a01cdSopenharmony_ci /** 80a69a01cdSopenharmony_ci * @brief get AccessibilityElementInfo list of active component. 81a69a01cdSopenharmony_ci * @return input AccessibilityElementInfo list 82a69a01cdSopenharmony_ci */ 83a69a01cdSopenharmony_ci const std::vector<std::shared_ptr<ComponentTree>>& GetActiveComponentInfos() 84a69a01cdSopenharmony_ci { 85a69a01cdSopenharmony_ci return inputComponentList_; 86a69a01cdSopenharmony_ci } 87a69a01cdSopenharmony_ci 88a69a01cdSopenharmony_ci /** 89a69a01cdSopenharmony_ci * @brief set input event component, and input type. 90a69a01cdSopenharmony_ci * @param index index of active element info list. 91a69a01cdSopenharmony_ci * @param actionType component input type. 92a69a01cdSopenharmony_ci */ 93a69a01cdSopenharmony_ci void SetInputcomponentIndex(int actionType, uint32_t index = INVALIDED_INPUT_INDEX); 94a69a01cdSopenharmony_ci 95a69a01cdSopenharmony_ci /** 96a69a01cdSopenharmony_ci * for scene update tree. 97a69a01cdSopenharmony_ci */ 98a69a01cdSopenharmony_cipublic: 99a69a01cdSopenharmony_ci /** 100a69a01cdSopenharmony_ci * @brief find the index of component, which one to input 101a69a01cdSopenharmony_ci * @return the index 102a69a01cdSopenharmony_ci */ 103a69a01cdSopenharmony_ci std::uint32_t FindInputComponentIndex(bool shouldScreenCap); 104a69a01cdSopenharmony_ci 105a69a01cdSopenharmony_ci /** 106a69a01cdSopenharmony_ci * @brief take Screen Capture 107a69a01cdSopenharmony_ci */ 108a69a01cdSopenharmony_ci void ScreenCapture(bool shouldScreenCap); 109a69a01cdSopenharmony_ci 110a69a01cdSopenharmony_ci /** 111a69a01cdSopenharmony_ci * @brief decide whether the component need be focused on 112a69a01cdSopenharmony_ci * @param type the component type to charge 113a69a01cdSopenharmony_ci */ 114a69a01cdSopenharmony_ci bool NeedFocus(const std::string & type) 115a69a01cdSopenharmony_ci { 116a69a01cdSopenharmony_ci if (focusTypeList_.size() > 0) { 117a69a01cdSopenharmony_ci uint32_t focusTypeIndex = WuKongUtil::GetInstance()->FindElement(focusTypeList_, type); 118a69a01cdSopenharmony_ci if (focusTypeIndex == INVALIDVALUE) { 119a69a01cdSopenharmony_ci return false; 120a69a01cdSopenharmony_ci } 121a69a01cdSopenharmony_ci } 122a69a01cdSopenharmony_ci return true; 123a69a01cdSopenharmony_ci } 124a69a01cdSopenharmony_ci 125a69a01cdSopenharmony_ci /** 126a69a01cdSopenharmony_ci * @brief set the component's every focused input number 127a69a01cdSopenharmony_ci * @param totalNum the focus input number 128a69a01cdSopenharmony_ci */ 129a69a01cdSopenharmony_ci void SetFocusNum(const std::string & focusNum) 130a69a01cdSopenharmony_ci { 131a69a01cdSopenharmony_ci focusNum_ = std::stoi(focusNum); 132a69a01cdSopenharmony_ci } 133a69a01cdSopenharmony_ci 134a69a01cdSopenharmony_ci /** 135a69a01cdSopenharmony_ci * @brief set the component's every focused input number 136a69a01cdSopenharmony_ci */ 137a69a01cdSopenharmony_ci uint32_t GetFocusNum() 138a69a01cdSopenharmony_ci { 139a69a01cdSopenharmony_ci return focusNum_; 140a69a01cdSopenharmony_ci } 141a69a01cdSopenharmony_ci 142a69a01cdSopenharmony_ci /** 143a69a01cdSopenharmony_ci * @brief set the component types to focus on 144a69a01cdSopenharmony_ci * @param totalNum the focus input number 145a69a01cdSopenharmony_ci */ 146a69a01cdSopenharmony_ci void SetFocusTypeList(const std::string &optarg) 147a69a01cdSopenharmony_ci { 148a69a01cdSopenharmony_ci SplitStr(optarg, ",", focusTypeList_); 149a69a01cdSopenharmony_ci } 150a69a01cdSopenharmony_ci 151a69a01cdSopenharmony_ci /** 152a69a01cdSopenharmony_ci * @brief check cur page has Dialog 153a69a01cdSopenharmony_ci * @return return hasDialog_ 154a69a01cdSopenharmony_ci */ 155a69a01cdSopenharmony_ci bool HasDialog() 156a69a01cdSopenharmony_ci { 157a69a01cdSopenharmony_ci return hasDialog_; 158a69a01cdSopenharmony_ci } 159a69a01cdSopenharmony_ci 160a69a01cdSopenharmony_ci /** 161a69a01cdSopenharmony_ci * @brief set ComponentTree list of active component. 162a69a01cdSopenharmony_ci * @param inputComponentList ComponentTree list. 163a69a01cdSopenharmony_ci */ 164a69a01cdSopenharmony_ci void SetActiveComponent(const std::vector<std::shared_ptr<ComponentTree>>& inputComponentList); 165a69a01cdSopenharmony_ci 166a69a01cdSopenharmony_ci /** 167a69a01cdSopenharmony_ci * @brief set a ComponentTree of active component. 168a69a01cdSopenharmony_ci * @param inputComponent a ComponentTree. 169a69a01cdSopenharmony_ci */ 170a69a01cdSopenharmony_ci void SetActiveComponent(const std::shared_ptr<ComponentTree>& inputComponent); 171a69a01cdSopenharmony_ci 172a69a01cdSopenharmony_ci /** 173a69a01cdSopenharmony_ci * @brief get current component tree. 174a69a01cdSopenharmony_ci * @return A ComponentTree 175a69a01cdSopenharmony_ci */ 176a69a01cdSopenharmony_ci const std::shared_ptr<ComponentTree>& GetCurrentComponents() 177a69a01cdSopenharmony_ci { 178a69a01cdSopenharmony_ci return currentComponentNode_; 179a69a01cdSopenharmony_ci } 180a69a01cdSopenharmony_ci /** 181a69a01cdSopenharmony_ci * @brief get new component tree 182a69a01cdSopenharmony_ci * @return A ComponentTree 183a69a01cdSopenharmony_ci */ 184a69a01cdSopenharmony_ci const std::shared_ptr<ComponentTree>& GetNewComponents() 185a69a01cdSopenharmony_ci { 186a69a01cdSopenharmony_ci return newComponentNode_; 187a69a01cdSopenharmony_ci } 188a69a01cdSopenharmony_ci 189a69a01cdSopenharmony_ci /** 190a69a01cdSopenharmony_ci * @brief get current page node. 191a69a01cdSopenharmony_ci * @return A ComponentTree 192a69a01cdSopenharmony_ci */ 193a69a01cdSopenharmony_ci const std::shared_ptr<PageTree>& GetCurrentPage() 194a69a01cdSopenharmony_ci { 195a69a01cdSopenharmony_ci return currentPageNode_; 196a69a01cdSopenharmony_ci } 197a69a01cdSopenharmony_ci 198a69a01cdSopenharmony_ci /** 199a69a01cdSopenharmony_ci * @brief get new page node 200a69a01cdSopenharmony_ci * @return A ComponentTree 201a69a01cdSopenharmony_ci */ 202a69a01cdSopenharmony_ci const std::shared_ptr<PageTree>& GetNewPage() 203a69a01cdSopenharmony_ci { 204a69a01cdSopenharmony_ci return newPageNode_; 205a69a01cdSopenharmony_ci } 206a69a01cdSopenharmony_ci 207a69a01cdSopenharmony_ci /** 208a69a01cdSopenharmony_ci * @brief get current ability node. 209a69a01cdSopenharmony_ci * @return A AblilityTree 210a69a01cdSopenharmony_ci */ 211a69a01cdSopenharmony_ci const std::shared_ptr<AbilityTree>& GetCurrentAbility() 212a69a01cdSopenharmony_ci { 213a69a01cdSopenharmony_ci return currentAbilityNode_; 214a69a01cdSopenharmony_ci } 215a69a01cdSopenharmony_ci 216a69a01cdSopenharmony_ci /** 217a69a01cdSopenharmony_ci * @brief get all app bundle tree. 218a69a01cdSopenharmony_ci * @return A AblilityTree list 219a69a01cdSopenharmony_ci */ 220a69a01cdSopenharmony_ci const std::vector<std::shared_ptr<AbilityTree>>& GetBundleList() 221a69a01cdSopenharmony_ci { 222a69a01cdSopenharmony_ci return abilityTreeList_; 223a69a01cdSopenharmony_ci } 224a69a01cdSopenharmony_ci 225a69a01cdSopenharmony_ci /** 226a69a01cdSopenharmony_ci * @brief add current page as a new page 227a69a01cdSopenharmony_ci * @return add new page result 228a69a01cdSopenharmony_ci */ 229a69a01cdSopenharmony_ci bool AddPage(); 230a69a01cdSopenharmony_ci /** 231a69a01cdSopenharmony_ci * @brief remove new page. 232a69a01cdSopenharmony_ci * @return remove new page result 233a69a01cdSopenharmony_ci */ 234a69a01cdSopenharmony_ci bool SamePage(); 235a69a01cdSopenharmony_ci 236a69a01cdSopenharmony_ci /** 237a69a01cdSopenharmony_ci * @brief back and goto existed page 238a69a01cdSopenharmony_ci * @param layer 0 update current page, < 0 update parent page, > 0 update child page 239a69a01cdSopenharmony_ci * @param index child index 240a69a01cdSopenharmony_ci * @return update page result 241a69a01cdSopenharmony_ci */ 242a69a01cdSopenharmony_ci bool UpdatePage(int layer, uint32_t index = INVALIDED_INPUT_INDEX); 243a69a01cdSopenharmony_ci 244a69a01cdSopenharmony_ci const std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo> GetNewElementInfoList(uint32_t index) 245a69a01cdSopenharmony_ci { 246a69a01cdSopenharmony_ci if (index < newElementInfoList_.size()) { 247a69a01cdSopenharmony_ci return newElementInfoList_[index]; 248a69a01cdSopenharmony_ci } else { 249a69a01cdSopenharmony_ci return {}; 250a69a01cdSopenharmony_ci } 251a69a01cdSopenharmony_ci } 252a69a01cdSopenharmony_ci 253a69a01cdSopenharmony_ci const std::map<std::string, std::uint32_t> GetComponentIndexMap() 254a69a01cdSopenharmony_ci { 255a69a01cdSopenharmony_ci return page2componentIndex_; 256a69a01cdSopenharmony_ci } 257a69a01cdSopenharmony_ci 258a69a01cdSopenharmony_ci const std::map<std::string, std::uint32_t> GetComponentInputCountMap() 259a69a01cdSopenharmony_ci { 260a69a01cdSopenharmony_ci return page2inputCount_; 261a69a01cdSopenharmony_ci } 262a69a01cdSopenharmony_ci 263a69a01cdSopenharmony_ci void SetOldPagePath(const std::string& pagePath) 264a69a01cdSopenharmony_ci { 265a69a01cdSopenharmony_ci pagePath_ = pagePath; 266a69a01cdSopenharmony_ci } 267a69a01cdSopenharmony_ci 268a69a01cdSopenharmony_ci std::string GetPagePath() 269a69a01cdSopenharmony_ci { 270a69a01cdSopenharmony_ci return pagePath_; 271a69a01cdSopenharmony_ci } 272a69a01cdSopenharmony_ci 273a69a01cdSopenharmony_ci void SetComponentType(const std::string& componmentType) 274a69a01cdSopenharmony_ci { 275a69a01cdSopenharmony_ci componmentType_ = componmentType; 276a69a01cdSopenharmony_ci } 277a69a01cdSopenharmony_ci 278a69a01cdSopenharmony_ci bool RecursComponent(const std::shared_ptr<ComponentTree>& componentTree); 279a69a01cdSopenharmony_ci 280a69a01cdSopenharmony_ci void RecursSetDialog(const std::shared_ptr<ComponentTree>& componentTree); 281a69a01cdSopenharmony_ci DECLARE_DELAYED_SINGLETON(TreeManager); 282a69a01cdSopenharmony_ci 283a69a01cdSopenharmony_ciprivate: 284a69a01cdSopenharmony_ci bool RecursGetChildElementInfo(const std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo>& parent, 285a69a01cdSopenharmony_ci const std::shared_ptr<ComponentTree>& componentParent); 286a69a01cdSopenharmony_ci bool FindAbility(const std::shared_ptr<AbilityTree>& abilityNode); 287a69a01cdSopenharmony_ci ErrCode MakeAndCheckNewAbility(); 288a69a01cdSopenharmony_ci bool UpdateCurrentPage(bool isAdd = false); 289a69a01cdSopenharmony_ci bool RemovePage(); 290a69a01cdSopenharmony_ci 291a69a01cdSopenharmony_ci std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo> inputElementInfo_; 292a69a01cdSopenharmony_ci std::shared_ptr<ComponentTree> inputComponent_; 293a69a01cdSopenharmony_ci std::vector<std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo>> inputElementInfoList_; 294a69a01cdSopenharmony_ci std::vector<std::shared_ptr<ComponentTree>> inputComponentList_; 295a69a01cdSopenharmony_ci 296a69a01cdSopenharmony_ci std::shared_ptr<ComponentTree> currentComponentNode_ = std::make_shared<ComponentTree>(); 297a69a01cdSopenharmony_ci std::shared_ptr<ComponentTree> newComponentNode_ = std::make_shared<ComponentTree>(); 298a69a01cdSopenharmony_ci 299a69a01cdSopenharmony_ci std::shared_ptr<AbilityTree> currentAbilityNode_ = std::make_shared<AbilityTree>(); 300a69a01cdSopenharmony_ci std::shared_ptr<AbilityTree> newAbilityNode_ = std::make_shared<AbilityTree>(); 301a69a01cdSopenharmony_ci 302a69a01cdSopenharmony_ci std::shared_ptr<PageTree> currentPageNode_ = std::make_shared<PageTree>(); 303a69a01cdSopenharmony_ci std::shared_ptr<PageTree> newPageNode_ = std::make_shared<PageTree>(); 304a69a01cdSopenharmony_ci 305a69a01cdSopenharmony_ci std::vector<std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo>> newElementInfoList_; 306a69a01cdSopenharmony_ci 307a69a01cdSopenharmony_ci std::vector<std::shared_ptr<OHOS::Accessibility::AccessibilityElementInfo>> elementInfoList_; 308a69a01cdSopenharmony_ci 309a69a01cdSopenharmony_ci std::vector<std::shared_ptr<AbilityTree>> abilityTreeList_; 310a69a01cdSopenharmony_ci std::map<std::uint32_t, std::shared_ptr<PageTree>> pageTreeList_; 311a69a01cdSopenharmony_ci std::map<std::uint32_t, std::shared_ptr<ComponentTree>> componentTreeList_; 312a69a01cdSopenharmony_ci 313a69a01cdSopenharmony_ci bool isUpdateComponentFinished_ = false; 314a69a01cdSopenharmony_ci bool isNewAbility_ = false; 315a69a01cdSopenharmony_ci 316a69a01cdSopenharmony_ci std::string pagePath_; 317a69a01cdSopenharmony_ci std::map<std::uint64_t, std::uint64_t> componentCountMap_; 318a69a01cdSopenharmony_ci bool hasDialog_ = false; 319a69a01cdSopenharmony_ci std::shared_ptr<ComponentTree> dialogComponent_ = nullptr; 320a69a01cdSopenharmony_ci 321a69a01cdSopenharmony_ci std::map<std::string, std::uint32_t> page2componentIndex_; 322a69a01cdSopenharmony_ci std::map<std::string, std::uint32_t> page2inputCount_; 323a69a01cdSopenharmony_ci std::string componmentType_ = ""; 324a69a01cdSopenharmony_ci std::uint32_t focusNum_ = FOCUS_NUM_DEFAULT; 325a69a01cdSopenharmony_ci std::vector<std::string> focusTypeList_; 326a69a01cdSopenharmony_ci}; 327a69a01cdSopenharmony_ci} // namespace WuKong 328a69a01cdSopenharmony_ci} // namespace OHOS 329a69a01cdSopenharmony_ci#endif 330