• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "normal_scene.h"
17 
18 #include "tree_manager.h"
19 
20 namespace OHOS {
21 namespace WuKong {
22 namespace {
23 const int MAXINPUTNUM = 3;
24 const int ONEHUNDRED = 100;
25 const int NEWPERCENT = 75;
26 const int OLDPERCENT = 20;
27 }  // namespace
NormalScene()28 NormalScene::NormalScene()
29 {
30 }
31 
~NormalScene()32 NormalScene::~NormalScene()
33 {
34 }
SetInputComponentList(std::vector<std::shared_ptr<ComponentTree>> & componentList)35 ErrCode NormalScene::SetInputComponentList(std::vector<std::shared_ptr<ComponentTree>> &componentList)
36 {
37     ErrCode result = OHOS::ERR_OK;
38     int randomNumber = rand() % ONEHUNDRED;
39     uint32_t count = 0;
40     DEBUG_LOG_STR("randomNumber: %d", randomNumber);
41     std::vector<uint32_t> indexList;
42     auto util = WuKongUtil::GetInstance();
43     std::vector<std::string> compIdBlock = util->GetCompIdBlockList();
44     std::vector<std::string> compTypeBlock = util->GetCompTypeBlockList();
45     if (randomNumber < NEWPERCENT) {
46         for (auto it = componentList.begin(); it != componentList.end(); it++) {
47             TRACK_LOG_STR("component inputcount: %d", (*it)->GetInputCount());
48             if ((*it)->GetInputCount() > MAXINPUTNUM || IsComponentBlock((*it), compIdBlock, compTypeBlock)) {
49                 indexList.push_back((*it)->GetIndex());
50                 TRACK_LOG_STR("index0: %d", distance(componentList.begin(), it));
51             }
52         }
53     } else if (randomNumber < (NEWPERCENT + OLDPERCENT)) {
54         for (auto it = componentList.begin(); it != componentList.end(); it++) {
55             TRACK_LOG_STR("component inputcount: %d", (*it)->GetInputCount());
56             if ((*it)->GetInputCount() <= MAXINPUTNUM || IsComponentBlock((*it), compIdBlock, compTypeBlock)) {
57                 count++;
58                 TRACK_LOG_STR("inputed count: %d, componentList size: %d", count, componentList.size());
59                 indexList.push_back((*it)->GetIndex());
60                 TRACK_LOG_STR("index: %d", distance(componentList.begin(), it));
61             }
62         }
63     }
64     if (count >= componentList.size()) {
65         if ((componentList.size() == 0) || (randomNumber < ONEHUNDRED && randomNumber >= (NEWPERCENT + OLDPERCENT))) {
66             isBack_ = true;
67         } else {
68             SubtractComponent(componentList, indexList);
69         }
70         indexList.clear();
71         return OHOS::ERR_OK;
72     }
73     TRACK_LOG_STR("componentList size: %d", componentList.size());
74     TRACK_LOG_STR("indexList size: %d", indexList.size());
75     SubtractComponent(componentList, indexList);
76     if ((componentList.size() == 0) || (randomNumber < ONEHUNDRED && randomNumber >= (NEWPERCENT + OLDPERCENT))) {
77         isBack_ = true;
78     }
79     indexList.clear();
80     return result;
81 }
82 
SetInputComponent(std::vector<std::shared_ptr<ComponentTree>> & componentList,std::shared_ptr<ComponentTree> & componentinfo)83 ErrCode NormalScene::SetInputComponent(std::vector<std::shared_ptr<ComponentTree>> &componentList,
84                                        std::shared_ptr<ComponentTree> &componentinfo)
85 {
86     auto util = WuKongUtil::GetInstance();
87     std::vector<std::string> compIdBlock = util->GetCompIdBlockList();
88     std::vector<std::string> compTypeBlock = util->GetCompTypeBlockList();
89     ErrCode result = OHOS::ERR_OK;
90     if (!componentList.empty()) {
91         auto treemanager = TreeManager::GetInstance();
92         bool hasDialog = treemanager->HasDialog();
93         bool meetDialog = false;
94         for (auto it : componentList) {
95             if (it->GetType() == "Dialog") {
96                 meetDialog = true;
97             }
98             if (hasDialog && !meetDialog) {
99                 continue;
100             }
101             DEBUG_LOG_STR("component inputcount: %d, node id: %016llX", it->GetInputCount(), it->GetNodeId());
102             if (it->GetInputCount() < 1 && !IsComponentBlock(it, compIdBlock, compTypeBlock)) {
103                 componentinfo = it;
104                 break;
105             }
106         }
107     }
108     if (componentinfo == nullptr) {
109         isBack_ = true;
110     }
111     return result;
112 }
113 
SetInputComponentListForFocusInput(std::vector<std::shared_ptr<ComponentTree>> & componentList)114 ErrCode NormalScene::SetInputComponentListForFocusInput(std::vector<std::shared_ptr<ComponentTree>> &componentList)
115 {
116     ErrCode result = OHOS::ERR_OK;
117     uint32_t count = 0;
118     std::vector<uint32_t> indexList;
119     auto treemanager = TreeManager::GetInstance();
120     uint32_t focusNum = treemanager->GetFocusNum();
121     auto util = WuKongUtil::GetInstance();
122     std::vector<std::string> compIdBlock = util->GetCompIdBlockList();
123     std::vector<std::string> compTypeBlock = util->GetCompTypeBlockList();
124     for (auto it = componentList.begin(); it != componentList.end(); it++) {
125         TRACK_LOG_STR("component inputcount: %d", (*it)->GetInputCount());
126         std::string type = (*it)->GetType();
127         bool needFocus = treemanager->NeedFocus(type);
128         uint32_t limit = needFocus ? focusNum : MAXINPUTNUM;
129         if ((*it)->GetInputCount() >= limit || IsComponentBlock((*it), compIdBlock, compTypeBlock)) {
130             indexList.push_back((*it)->GetIndex());
131             count++;
132             TRACK_LOG_STR("index0: %d", distance(componentList.begin(), it));
133         }
134     }
135     if (count >= componentList.size()) {
136         isBack_ = true;
137         indexList.clear();
138         return OHOS::ERR_OK;
139     }
140     // just determine back or not, can not remove component because of locating component after
141     if (componentList.size() == 0) {
142         isBack_ = true;
143     }
144     indexList.clear();
145     return result;
146 }
147 
SubtractComponent(std::vector<std::shared_ptr<ComponentTree>> & componentList,std::vector<uint32_t> & indexList)148 void NormalScene::SubtractComponent(std::vector<std::shared_ptr<ComponentTree>> &componentList,
149     std::vector<uint32_t> &indexList)
150 {
151     for (auto index : indexList) {
152         for (auto it = componentList.begin(); it != componentList.end(); it++) {
153             if ((*it)->GetIndex() == index) {
154                 componentList.erase(it);
155                 it--;
156             }
157         }
158     }
159 }
160 
IsComponentBlock(std::shared_ptr<ComponentTree> & comp,std::vector<std::string> & compIdBlock,std::vector<std::string> & compTypeBlock)161 bool NormalScene::IsComponentBlock(std::shared_ptr<ComponentTree> &comp, std::vector<std::string> &compIdBlock,
162     std::vector<std::string> &compTypeBlock)
163 {
164     std::string id = comp->GetInspectorKey();
165     std::string type = comp->GetType();
166     auto util = WuKongUtil::GetInstance();
167     if (util->ContainsElement(compIdBlock, id)) {
168         DEBUG_LOG_STR("Block Id: %s", id.c_str());
169         return true;
170     }
171     if (util->ContainsElement(compTypeBlock, type)) {
172         DEBUG_LOG_STR("Block type: %s", type.c_str());
173         return true;
174     }
175     DEBUG_LOG_STR("UnBlock Id: %s, type: %s", id.c_str(), type.c_str());
176     return false;
177 }
178 }  // namespace WuKong
179 }  // namespace OHOS
180