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 "component_tree.h"
17
18 #include "tree_manager.h"
19 #include "wukong_define.h"
20
21 namespace OHOS {
22 namespace WuKong {
23 namespace {
24 const uint8_t COMPONENT_TYPE_POSION = 48;
25 const uint8_t COMPONENT_WIDTH_POSION = 36;
26 const uint8_t COMPONENT_HEIGHT_POSION = 24;
27 const uint8_t COMPONENT_CONTENT_POSION = 8;
28 const uint8_t COMPONENT_RESERVED_POSION = 0;
29 } // namespace
RecursUpdateInfo(const std::shared_ptr<ComponentTree> & source)30 bool ComponentTree::RecursUpdateInfo(const std::shared_ptr<ComponentTree>& source)
31 {
32 if (source == nullptr) {
33 ERROR_LOG("the argument source is nullptr.");
34 return false;
35 }
36 // Copy source count info to new component node.
37 expectedInputCount_ = source->expectedInputCount_;
38 inputCount_ = source->inputCount_;
39 inputTypeCountMap_ = source->inputTypeCountMap_;
40
41 // Recurs component tree for copy count info.
42 for (auto child : children_) {
43 for (auto sourceChild : source->children_) {
44 if (child->IsEqual(sourceChild)) {
45 std::static_pointer_cast<ComponentTree>(child)->RecursUpdateInfo(
46 std::static_pointer_cast<ComponentTree>(sourceChild));
47 break;
48 }
49 }
50 }
51 return true;
52 }
53
54 /**
55 * @brief component Node Id specification format
56 * @details
57 * |----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|
58 * |TYPE-16 |WIDTH-12 |HEIGHT-12 |CONTENT - 16 |RESERVED |
59 */
SetNodeId()60 bool ComponentTree::SetNodeId()
61 {
62 const uint8_t typeCount = 2;
63 const uint8_t contentCount = 2;
64 nodeId_ = 0;
65 auto elementInfo = TreeManager::GetInstance()->GetNewElementInfoList(index_);
66 if (elementInfo == nullptr) {
67 ERROR_LOG("get new element info is nullptr");
68 return false;
69 }
70
71 rect_ = elementInfo->GetRectInScreen();
72 isVisible_ = elementInfo->IsVisible();
73 // type is component type or component id of the ElementInfo
74 type_ = elementInfo->GetComponentType();
75 uint64_t type = GetSubName(type_, typeCount);
76 // w is width of the ElementInfo
77 uint64_t w = (uint64_t)(rect_.GetRightBottomXScreenPostion() - rect_.GetLeftTopXScreenPostion());
78 // h is width of the ElementInfo
79 uint64_t h = (uint64_t)(rect_.GetRightBottomYScreenPostion() - rect_.GetLeftTopYScreenPostion());
80 // the ElementInfo content of 2 length
81 uint64_t str = GetSubName(elementInfo->GetContent(), contentCount);
82
83 // the ElementInfo name of 4 length
84 TRACK_LOG_STR("component Type: (%d), Width: (%d), Height: (%d)", (uint32_t)type, (int32_t)w, (int32_t)h);
85 nodeId_ |= type << COMPONENT_TYPE_POSION;
86 nodeId_ |= w << COMPONENT_WIDTH_POSION;
87 nodeId_ |= h << COMPONENT_HEIGHT_POSION;
88 nodeId_ |= str << COMPONENT_CONTENT_POSION;
89 nodeId_ |= index_ << COMPONENT_RESERVED_POSION;
90 inspectorKey_ = elementInfo->GetInspectorKey();
91 TRACK_LOG_STR("component Node ID: (0x%016llX), inspectorKey: (%s)", nodeId_, inspectorKey_.c_str());
92 return true;
93 }
94 } // namespace WuKong
95 } // namespace OHOS
96