aurum: add waiter for bootstrap 34/283834/1
authorHosang Kim <hosang12.kim@samsung.com>
Fri, 29 Jul 2022 09:57:54 +0000 (18:57 +0900)
committerChun <jykeon@samsung.com>
Fri, 4 Nov 2022 01:05:34 +0000 (01:05 +0000)
Change-Id: I6a0e682e817384e94d3265d375fc3b5815835d76
(cherry picked from commit 7b43287c5574a8320e1921459743753cc4b72297)

libaurum/inc/Until.h
libaurum/inc/Waiter.h
libaurum/src/Until.cc
libaurum/src/Waiter.cc
org.tizen.aurum-bootstrap/inc/AurumServiceImpl.h
org.tizen.aurum-bootstrap/inc/Commands/FindElementCommand.h
org.tizen.aurum-bootstrap/inc/Commands/FindElementsCommand.h
org.tizen.aurum-bootstrap/src/AurumServiceImpl.cc
org.tizen.aurum-bootstrap/src/Commands/FindElementCommand.cc
org.tizen.aurum-bootstrap/src/Commands/FindElementsCommand.cc
protocol/aurum.proto

index ecbaeed..f34c8c5 100644 (file)
@@ -115,6 +115,19 @@ public:
      */
     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);
 };
 
 }
index e865ecf..fe95ecc 100644 (file)
@@ -47,11 +47,13 @@ public:
      *
      * @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.
@@ -85,6 +87,18 @@ public:
     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;
index 3a30831..0affb12 100644 (file)
@@ -46,3 +46,13 @@ std::function<bool(const UiObject *)> Until::checkable(const bool isCheckable)
         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;
+    };
+}
index 43c8194..0bc0278 100644 (file)
@@ -26,11 +26,11 @@ Waiter::Waiter() : Waiter(nullptr) {}
 
 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}
 {
 }
 
@@ -44,6 +44,10 @@ template std::shared_ptr<UiObject> Waiter::waitFor(
 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
 {
@@ -82,3 +86,21 @@ R Waiter::waitFor(const std::function<R(const UiObject *)> 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;
+}
index 5857444..a47581e 100644 (file)
@@ -129,6 +129,11 @@ public:
     ::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
index 01e4a21..4edc4e8 100644 (file)
@@ -26,13 +26,15 @@ class FindElementCommand : public Command {
 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);
index c7ea99e..92d325b 100644 (file)
@@ -26,13 +26,15 @@ class FindElementsCommand : public Command {
 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);
index ca19a75..0cb4f82 100644 (file)
@@ -29,6 +29,7 @@ using namespace grpc;
 using namespace aurum;
 
 aurumServiceImpl::aurumServiceImpl()
+    : WAIT_TIMEOUT_MS{0}
 {
     LOGI("creates watcher instance (start to look up at_spi server)");
     AccessibleWatcher::getInstance();
@@ -60,7 +61,7 @@ aurumServiceImpl::~aurumServiceImpl()
     ::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);
 }
 
@@ -68,7 +69,7 @@ aurumServiceImpl::~aurumServiceImpl()
     ::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);
 }
 
@@ -288,3 +289,14 @@ aurumServiceImpl::~aurumServiceImpl()
     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;
+}
index c2664ad..c0d4641 100644 (file)
 #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();
 }
@@ -126,7 +128,8 @@ std::shared_ptr<UiSelector> FindElementCommand::getSelector(void)
             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();
index 3a0e6b7..fe09e14 100644 (file)
 #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();
 }
@@ -134,8 +136,10 @@ std::vector<std::shared_ptr<UiSelector>> FindElementsCommand::getSelectors(void)
 
         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));
         }
 
index d1a7696..2240ae5 100644 (file)
@@ -36,6 +36,7 @@ service Bootstrap {
    rpc getActiveAppToolkitName(ReqGetActiveAppToolkitName) returns (RspGetActiveAppToolkitName) {}
    rpc enableScreenAnalyzer(ReqEnableScreenAnalyzer) returns (RspEnableScreenAnalyzer) {}
    rpc getTextMinBoundingRect(ReqGetTextMinBoundingRect) returns (RspGetTextMinBoundingRect) {}
+   rpc setTimeout(ReqSetTimeout) returns (RspSetTimeout) {}
 }
 
 // ------------------------------------ //
@@ -610,3 +611,11 @@ message RspGetTextMinBoundingRect {
    RspStatus status = 1;
    Rect size = 2;
 }
+
+message ReqSetTimeout {
+   int32 timeout = 1;
+}
+
+message RspSetTimeout {
+   RspStatus status = 1;
+}