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 }