*/
static std::function<bool(const UiObject *)> checkable(
const bool isCheckable);
+
+ /**
+ * @brief Checks that there are objects that are satisfied with selector condition.
+ *
+ * @param[in] selector @UiSelctor
+ *
+ * @return function that performs findObjects
+ * returned function will return vector if succeed, else vector size is zero
+ *
+ * @since_tizen 7.0
+ */
+ static std::function<std::vector<std::shared_ptr<UiObject>>(const ISearchable *)>
+ findObjects(const std::shared_ptr<UiSelector> selector);
};
}
*
* @param[in] searchableObject ISearchable pointer
* @param[in] uiObject UiObject pointer
+ * @param[in] timeout timeout value
*
* @since_tizen 6.5
*/
Waiter(const ISearchable *searchableObject,
- const UiObject *uiObject = nullptr);
+ const UiObject *uiObject = nullptr,
+ const int timeout = 5000);
/**
* @brief Waiter destructor.
template <typename R>
R waitFor(const std::function<R(const UiObject *)> object) const;
+ /**
+ * @brief wait for condition satisfied.
+ *
+ * @param[in] condition @ISearchable
+ *
+ * @return template vector
+ *
+ * @since_tizen 7.0
+ */
+ template <typename R>
+ std::vector<R> waitFor(const std::function<std::vector<R>(const ISearchable *)> condition) const;
+
private:
const ISearchable *mSearchableObject;
const UiObject *mUiObject;
return object->isClickable() == isCheckable;
};
}
+
+std::function<std::vector<std::shared_ptr<UiObject>>(const ISearchable *)> Until::findObjects(
+ const std::shared_ptr<UiSelector> selector)
+{
+ return [=](const ISearchable *searchable) -> std::vector<std::shared_ptr<UiObject>> {
+ LOGI("findObjects search:%p", searchable);
+ std::vector<std::shared_ptr<UiObject>> result = searchable->findObjects(selector);
+ return result;
+ };
+}
Waiter::~Waiter() {}
-Waiter::Waiter(const ISearchable *searchableObject, const UiObject *uiObject)
+Waiter::Waiter(const ISearchable *searchableObject, const UiObject *uiObject, const int timeout)
: mSearchableObject{searchableObject},
mUiObject{uiObject},
- WAIT_INTERVAL_MS{500},
- WAIT_TIMEOUT_MS{5000}
+ WAIT_INTERVAL_MS{100},
+ WAIT_TIMEOUT_MS{timeout}
{
}
template bool Waiter::waitFor(
const std::function<bool(const UiObject *)> condition) const;
+template std::vector<std::shared_ptr<UiObject>> Waiter::waitFor(
+ const std::function<std::vector<std::shared_ptr<UiObject>> (const ISearchable *)>
+ condition) const;
+
template <typename R>
R Waiter::waitFor(const std::function<R(const ISearchable *)> condition) const
{
}
return R();
}
+
+template <typename R>
+std::vector<R> Waiter::waitFor(const std::function<std::vector<R>(const ISearchable *)> condition) const
+{
+ LOGI("waitFor ISearchable");
+ std::chrono::system_clock::time_point start =
+ std::chrono::system_clock::now();
+ std::vector<R> result = condition(mSearchableObject);
+ while (result.empty()) {
+ if ((std::chrono::system_clock::now() - start) >
+ std::chrono::milliseconds{WAIT_TIMEOUT_MS})
+ break;
+ std::this_thread::sleep_for(
+ std::chrono::milliseconds{WAIT_INTERVAL_MS});
+ result = condition(mSearchableObject);
+ }
+ return result;
+}
::grpc::Status getTextMinBoundingRect(::grpc::ServerContext *context,
const ::aurum::ReqGetTextMinBoundingRect *request,
::aurum::RspGetTextMinBoundingRect *response) override;
+ ::grpc::Status setTimeout(::grpc::ServerContext *context,
+ const ::aurum::ReqSetTimeout *request,
+ ::aurum::RspSetTimeout *response) override;
+public:
+ int WAIT_TIMEOUT_MS;
};
#endif
protected:
const ::aurum::ReqFindElement *mRequest;
::aurum::RspFindElement *mResponse;
+ int mTimeout;
protected:
ObjectMapper *mObjMap;
public:
FindElementCommand(const ::aurum::ReqFindElement *request,
- ::aurum::RspFindElement *response);
+ ::aurum::RspFindElement *response,
+ int timeout = 0);
::grpc::Status execute() override;
protected:
virtual std::shared_ptr<ISearchable> getSearchableTop(void);
protected:
const ::aurum::ReqFindElements *mRequest;
::aurum::RspFindElements *mResponse;
+ int mTimeout;
protected:
ObjectMapper *mObjMap;
public:
FindElementsCommand(const ::aurum::ReqFindElements *request,
- ::aurum::RspFindElements *response);
+ ::aurum::RspFindElements *response,
+ int timeout = 0);
::grpc::Status execute() override;
protected:
virtual std::shared_ptr<ISearchable> getSearchableTop(void);
using namespace aurum;
aurumServiceImpl::aurumServiceImpl()
+ : WAIT_TIMEOUT_MS{0}
{
LOGI("creates watcher instance (start to look up at_spi server)");
AccessibleWatcher::getInstance();
::grpc::ServerContext *context, const ::aurum::ReqFindElement *request,
::aurum::RspFindElement *response)
{
- std::unique_ptr<FindElementCommand> cmd = std::make_unique<FindElementCommand>(request, response);
+ std::unique_ptr<FindElementCommand> cmd = std::make_unique<FindElementCommand>(request, response, WAIT_TIMEOUT_MS);
return execute(cmd.get(), true);
}
::grpc::ServerContext *context, const ::aurum::ReqFindElements *request,
::aurum::RspFindElements *response)
{
- std::unique_ptr<FindElementsCommand> cmd = std::make_unique<FindElementsCommand>(request, response);
+ std::unique_ptr<FindElementsCommand> cmd = std::make_unique<FindElementsCommand>(request, response, WAIT_TIMEOUT_MS);
return execute(cmd.get(), true);
}
std::unique_ptr<GetTextMinBoundingRectCommand> cmd = std::make_unique<GetTextMinBoundingRectCommand>(request, response);
return execute(cmd.get(), true);
}
+
+::grpc::Status aurumServiceImpl::setTimeout(::grpc::ServerContext *context,
+ const ::aurum::ReqSetTimeout *request,
+ ::aurum::RspSetTimeout *response)
+{
+ WAIT_TIMEOUT_MS = request->timeout();
+ LOGI("setTimeout: %d", WAIT_TIMEOUT_MS);
+
+ response->set_status(::aurum::RspStatus::OK);
+ return ::grpc::Status::OK;
+}
#ifdef MQTT_ENABLED
#include "SaObject.h"
#endif
+#include "Until.h"
FindElementCommand::FindElementCommand(const ::aurum::ReqFindElement *request,
- ::aurum::RspFindElement *response)
- : mRequest{request}, mResponse{response}
+ ::aurum::RspFindElement *response,
+ int timeout)
+ : mRequest{request}, mResponse{response}, mTimeout(timeout)
{
mObjMap = ObjectMapper::getInstance();
}
mDevice->RequestScreenAnalyze();
}
- auto found = searchableObj->findObject(selector);
+ auto waiter = new Waiter(searchableObj.get(), nullptr, mTimeout);
+ auto found = waiter->waitFor(Until::findObject(selector));
if (found != nullptr) {
UiObject *obj = found.get();
#ifdef MQTT_ENABLED
#include "SaObject.h"
#endif
+#include "Until.h"
FindElementsCommand::FindElementsCommand(const ::aurum::ReqFindElements *request,
- ::aurum::RspFindElements *response)
- : mRequest{request}, mResponse{response}
+ ::aurum::RspFindElements *response,
+ int timeout)
+ : mRequest{request}, mResponse{response}, mTimeout{timeout}
{
mObjMap = ObjectMapper::getInstance();
}
std::vector<std::shared_ptr<UiObject>> founds = {};
+ auto waiter = new Waiter(searchableObj.get(), nullptr, mTimeout);
+
for ( auto &sel : selectors ) {
- auto ret = searchableObj->findObjects(sel);
+ auto ret = waiter->waitFor(Until::findObjects(sel));
std::move(std::begin(ret), std::end(ret), std::back_inserter(founds));
}
rpc getActiveAppToolkitName(ReqGetActiveAppToolkitName) returns (RspGetActiveAppToolkitName) {}
rpc enableScreenAnalyzer(ReqEnableScreenAnalyzer) returns (RspEnableScreenAnalyzer) {}
rpc getTextMinBoundingRect(ReqGetTextMinBoundingRect) returns (RspGetTextMinBoundingRect) {}
+ rpc setTimeout(ReqSetTimeout) returns (RspSetTimeout) {}
}
// ------------------------------------ //
RspStatus status = 1;
Rect size = 2;
}
+
+message ReqSetTimeout {
+ int32 timeout = 1;
+}
+
+message RspSetTimeout {
+ RspStatus status = 1;
+}