• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 "ui_driver.h"
17 
18 // register all the ExternAPI creators and invokers.
19 namespace OHOS::uitest {
20     using namespace std;
21     using namespace nlohmann;
22 
23     /**Create KeyAction object by index.*/
CreateKeyAction(uint32_t index,uint32_t keyCode)24     static unique_ptr<KeyAction> CreateKeyAction(uint32_t index, uint32_t keyCode)
25     {
26         if (index == UiKey::BACK) {
27             return make_unique<Back>();
28         } else if (index == UiKey::GENERIC) {
29             return make_unique<AnonymousSingleKey>(keyCode);
30         } else {
31             return nullptr;
32         }
33     }
34 
WidgetSelectorHandler(string_view function,json & caller,const json & in,json & out,ApiCallErr & err)35     static bool WidgetSelectorHandler(string_view function, json &caller, const json &in, json &out, ApiCallErr &err)
36     {
37         static const set<string_view> widgetSelectorApis = {
38             "WidgetSelector::<init>", "WidgetSelector::AddMatcher",
39             "WidgetSelector::AddFrontLocator", "WidgetSelector::AddRearLocator"};
40         if (widgetSelectorApis.find(function) == widgetSelectorApis.end()) {
41             return false;
42         }
43 
44         if (function == "WidgetSelector::<init>") {
45             auto selector = WidgetSelector();
46             PushBackValueItemIntoJson<WidgetSelector>(selector, out);
47             return true;
48         }
49 
50         auto selector = WidgetSelector();
51         selector.ReadFromParcel(caller);
52         if (function == "WidgetSelector::AddMatcher") {
53             auto attrName = GetItemValueFromJson<string>(in, 0);
54             auto testValue = GetItemValueFromJson<string>(in, 1);
55             auto matchRule = GetItemValueFromJson<uint32_t>(in, 2);
56             if (matchRule < EQ || matchRule > ENDS_WITH) {
57                 err = ApiCallErr(INTERNAL_ERROR, "Illegal match rule: " + to_string(matchRule));
58             }
59             auto matcher = WidgetAttrMatcher(attrName, testValue, static_cast<ValueMatchRule>(matchRule));
60             selector.AddMatcher(matcher);
61         } else if (function == "WidgetSelector::AddFrontLocator") {
62             auto frontLocator = WidgetSelector();
63             frontLocator.ReadFromParcel(GetItemValueFromJson<json>(in, 0));
64             selector.AddFrontLocator(frontLocator, err);
65         } else if (function == "WidgetSelector::AddRearLocator") {
66             auto rearLocator = WidgetSelector();
67             rearLocator.ReadFromParcel(GetItemValueFromJson<json>(in, 0));
68             selector.AddRearLocator(rearLocator, err);
69         }
70         // write back updated object meta-data
71         caller.clear();
72         selector.WriteIntoParcel(caller);
73         return true;
74     }
75 
UiDriverHandlerA(string_view function,json & caller,const json & in,json & out,ApiCallErr & err)76     static bool UiDriverHandlerA(string_view function, json &caller, const json &in, json &out, ApiCallErr &err)
77     {
78         static const set<string_view> uiDriverApis = {
79             "UiDriver::<init>", "UiDriver::FindWidgets", "UiDriver::TriggerKey"};
80         if (uiDriverApis.find(function) == uiDriverApis.end()) {
81             return false;
82         }
83 
84         if (function == "UiDriver::<init>") {
85             string targetDevice = "local";
86             if (!in.empty()) {
87                 targetDevice = GetItemValueFromJson<string>(in, 0);
88             }
89             auto driver = UiDriver(targetDevice);
90             PushBackValueItemIntoJson<UiDriver>(driver, out);
91             return true;
92         }
93 
94         auto driver = UiDriver("");
95         driver.ReadFromParcel(caller);
96         if (function == "UiDriver::FindWidgets") {
97             auto selector = WidgetSelector();
98             selector.ReadFromParcel(GetItemValueFromJson<json>(in, 0));
99             vector<unique_ptr<WidgetImage>> rev;
100             driver.FindWidgets(selector, rev, err);
101             for (auto &ptr:rev) {
102                 PushBackValueItemIntoJson<WidgetImage>(*ptr, out);
103             }
104         } else if (function == "UiDriver::TriggerKey") {
105             const auto keyIndex = GetItemValueFromJson<uint32_t>(in, 0);
106             uint32_t keyCode = 0;
107             if (in.size() >= INDEX_TWO) {
108                 keyCode = GetItemValueFromJson<uint32_t>(in, 1);
109             }
110             unique_ptr<KeyAction> action = CreateKeyAction(keyIndex, keyCode);
111             if (action == nullptr) {
112                 err = ApiCallErr(INTERNAL_ERROR, "No such KeyAction: " + to_string(keyIndex));
113             } else {
114                 driver.TriggerKey(*action, err);
115             }
116         }
117         // write back updated object meta-data
118         caller.clear();
119         driver.WriteIntoParcel(caller);
120         return true;
121     }
122 
UiDriverHandlerB(string_view function,json & caller,const json & in,json & out,ApiCallErr & err)123     static bool UiDriverHandlerB(string_view function, json &caller, const json &in, json &out, ApiCallErr &err)
124     {
125         static const set<string_view> uiDriverApis = {"UiDriver::PerformWidgetOperate",
126             "UiDriver::InputText", "UiDriver::ScrollSearch", "UiDriver::GetWidgetAttribute"};
127         if (uiDriverApis.find(function) == uiDriverApis.end()) {
128             return false;
129         }
130 
131         auto driver = UiDriver("");
132         driver.ReadFromParcel(caller);
133         if (function == "UiDriver::PerformWidgetOperate") {
134             auto img = WidgetImage();
135             img.ReadFromParcel(GetItemValueFromJson<json>(in, 0));
136             const auto opType = static_cast<WidgetOp>(GetItemValueFromJson<uint32_t>(in, 1));
137             driver.PerformWidgetOperate(img, opType, err);
138         } else if (function == "UiDriver::InputText") {
139             auto img = WidgetImage();
140             img.ReadFromParcel(GetItemValueFromJson<json>(in, 0));
141             const auto text = GetItemValueFromJson<string>(in, 1);
142             driver.InputText(img, text, err);
143         } else if (function == "UiDriver::ScrollSearch") {
144             auto img = WidgetImage();
145             auto selector = WidgetSelector();
146             img.ReadFromParcel(GetItemValueFromJson<json>(in, 0));
147             selector.ReadFromParcel(GetItemValueFromJson<json>(in, 1));
148             static constexpr int32_t scrollDeadZone = 20;
149             auto imgPtr = driver.ScrollSearch(img, selector, err, scrollDeadZone);
150             if (imgPtr != nullptr) {
151                 PushBackValueItemIntoJson(*imgPtr, out);
152             }
153         } else if (function == "UiDriver::GetWidgetAttribute") {
154             auto img = WidgetImage();
155             img.ReadFromParcel(GetItemValueFromJson<json>(in, 0));
156             auto attrName = GetItemValueFromJson<string>(in, 1);
157             // update widget and then get attribute
158             driver.UpdateWidgetImage(img, err);
159             auto attrValue = img.GetAttribute(attrName, "null");
160             if (attrValue != "null") {
161                 PushBackValueItemIntoJson<string>(attrValue, out);
162             }
163         }
164         // write back updated object meta-data
165         caller.clear();
166         driver.WriteIntoParcel(caller);
167         return true;
168     }
169 
UiDriverHandlerC(string_view function,json & caller,const json & in,json & out,ApiCallErr & err)170     static bool UiDriverHandlerC(string_view function, json &caller, const json &in, json &out, ApiCallErr &err)
171     {
172         static const set<string_view> uiDriverApis = {"UiDriver::PerformGenericClick", "UiDriver::PerformGenericSwipe",
173             "UiDriver::DragWidgetToAnother", "UiDriver::TakeScreenCap", "UiDriver::DelayMs"};
174         if (uiDriverApis.find(function) == uiDriverApis.end()) {
175             return false;
176         }
177 
178         auto driver = UiDriver("");
179         driver.ReadFromParcel(caller);
180         if (function == "UiDriver::PerformGenericClick") {
181             const auto actionType = static_cast<PointerOp>(GetItemValueFromJson<uint32_t>(in, 0));
182             auto px = GetItemValueFromJson<int32_t>(in, 1);
183             auto py = GetItemValueFromJson<int32_t>(in, 2);
184             driver.PerformGenericClick(actionType, {px, py}, err);
185         } else if (function == "UiDriver::PerformGenericSwipe") {
186             const auto actionType = static_cast<PointerOp>(GetItemValueFromJson<uint32_t>(in, 0));
187             auto px0 = GetItemValueFromJson<int32_t>(in, 1);
188             auto py0 = GetItemValueFromJson<int32_t>(in, 2);
189             auto px1 = GetItemValueFromJson<int32_t>(in, 3);
190             auto py1 = GetItemValueFromJson<int32_t>(in, 4);
191             driver.PerformGenericSwipe(actionType, {px0, py0}, {px1, py1}, err);
192         } else if (function == "UiDriver::DragWidgetToAnother") {
193             auto img0 = WidgetImage();
194             img0.ReadFromParcel(GetItemValueFromJson<json>(in, 0));
195             auto img1 = WidgetImage();
196             img1.ReadFromParcel(GetItemValueFromJson<json>(in, 1));
197             driver.DragWidgetToAnother(img0, img1, err);
198         } else if (function == "UiDriver::TakeScreenCap") {
199             driver.TakeScreenCap(GetItemValueFromJson<string>(in, 0), err);
200             PushBackValueItemIntoJson<bool>(err.code_ == NO_ERROR, out);
201         } else if (function == "UiDriver::DelayMs") {
202             UiDriver::DelayMs(GetItemValueFromJson<uint32_t>(in, 0));
203         }
204         // write back updated object meta-data
205         caller.clear();
206         driver.WriteIntoParcel(caller);
207         return true;
208     }
209 
RegisterExternApIs()210     void RegisterExternApIs()
211     {
212         auto &server = ExternApiServer::Get();
213         server.AddHandler(WidgetSelectorHandler);
214         server.AddHandler(UiDriverHandlerA);
215         server.AddHandler(UiDriverHandlerB);
216         server.AddHandler(UiDriverHandlerC);
217     }
218 }