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