From 7d8dcc44f3ce070b16ae449e29db57f1adfebc5d Mon Sep 17 00:00:00 2001 From: Woochanlee Date: Fri, 16 Jul 2021 16:50:21 +0900 Subject: [PATCH] Aurum: findObject performance improvement Improved object search logic as is - 1. process list up <- performance degradation point 2. active window list up to be - 1. activated window's process list up 2. active window list up Use runnable feature to look up window event when app launched. Change-Id: I607ae2c20b594b256b2e7b23d5a32eaad90eb255 --- .../inc/Accessibility/AccessibleWatcher.h | 2 + .../Accessibility/AtspiAccessibleWatcher.h | 5 +- .../Accessibility/MockAccessibleWatcher.h | 4 ++ libaurum/inc/UiDevice.h | 2 +- .../Accessibility/AtspiAccessibleWatcher.cc | 29 ++++++++++- .../Accessibility/MockAccessibleWatcher.cc | 4 ++ libaurum/src/UiDevice.cc | 13 +++-- .../inc/Commands/LaunchAppCommand.h | 1 - .../inc/Runnable/LaunchAppRunnable.h | 15 ++++++ org.tizen.aurum-bootstrap/meson.build | 2 + .../src/Commands/LaunchAppCommand.cc | 48 +++-------------- .../src/Runnable/LaunchAppRunnable.cc | 51 +++++++++++++++++++ 12 files changed, 126 insertions(+), 50 deletions(-) create mode 100644 org.tizen.aurum-bootstrap/inc/Runnable/LaunchAppRunnable.h create mode 100644 org.tizen.aurum-bootstrap/src/Runnable/LaunchAppRunnable.cc diff --git a/libaurum/inc/Accessibility/AccessibleWatcher.h b/libaurum/inc/Accessibility/AccessibleWatcher.h index d9869cd..3090741 100644 --- a/libaurum/inc/Accessibility/AccessibleWatcher.h +++ b/libaurum/inc/Accessibility/AccessibleWatcher.h @@ -7,6 +7,7 @@ #include "IEventSource.h" #include "Runnable.h" #include "A11yEvent.h" +#include #include #include @@ -64,6 +65,7 @@ public: */ virtual bool executeAndWaitForEvents(const Runnable *cmd, const A11yEvent type, const int timeout) = 0; + virtual std::map> getActiveAppMap(void) = 0; public: /** * @brief TBD diff --git a/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h b/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h index d0590b4..663835f 100644 --- a/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h +++ b/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h @@ -2,6 +2,7 @@ #include "AccessibleNode.h" #include "AccessibleWatcher.h" +#include "AtspiAccessibleApplication.h" #include #include @@ -104,6 +105,8 @@ public: */ virtual bool executeAndWaitForEvents(const Runnable *cmd, const A11yEvent type, const int timeout) override; + virtual std::map> getActiveAppMap(void) override; + public: /** * @brief TBD @@ -221,7 +224,7 @@ private: /** * @brief TBD */ - std::map mWindowAppMap; + std::map> mActiveAppMap; /** * @brief TBD diff --git a/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h b/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h index f51097b..5721722 100644 --- a/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h +++ b/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h @@ -49,6 +49,8 @@ public: */ virtual bool executeAndWaitForEvents(const Runnable *cmd, const A11yEvent type, const int timeout) override; + std::map> getActiveAppMap(void); + public: /** * @brief TBD @@ -67,4 +69,6 @@ private: * @brief TBD */ std::vector> mApplicationList; + + std::map> mActiveAppMap; }; diff --git a/libaurum/inc/UiDevice.h b/libaurum/inc/UiDevice.h index dbda79c..03cce46 100644 --- a/libaurum/inc/UiDevice.h +++ b/libaurum/inc/UiDevice.h @@ -176,7 +176,7 @@ public: */ bool sendKeyAndWaitForEvents( const std::string keycode, const A11yEvent type, const int timeout) const; -private: + bool executeAndWaitForEvents( const Runnable *cmd, const A11yEvent type, const int timeout) const; public: diff --git a/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc b/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc index 544c56d..a1778c6 100644 --- a/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc +++ b/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc @@ -149,7 +149,29 @@ void AtspiAccessibleWatcher::onAtspiEvents(AtspiEvent *event, void *user_data) if (app) { pkg = AtspiWrapper::Atspi_accessible_get_name(app, NULL); - g_object_unref(app); + if (!strncmp(event->type, "window:activate", 15)) { + LOGI("window activated in app(%s)", pkg); + if (!instance->mActiveAppMap.count(app)) { + LOGI("add activated window's app in map"); + instance->mActiveAppMap.insert(std::pair>(app, + std::make_shared(std::make_shared(app)))); + } + else { + LOGI("app(%s) is already in map", pkg); + } + } + else if (!strncmp(event->type, "window:deactivate", 16)) { + LOGI("window deactivate in app(%s)", pkg); + if (!instance->mActiveAppMap.count(app)) { + LOGI("window deactivated delete app(%s) in map", pkg); + instance->mActiveAppMap.erase(app); + } + else { + LOGE("deactivated window's app(%s) is not in map", pkg); + } + + g_object_unref(app); + } } else pkg = strdup(""); @@ -301,6 +323,11 @@ bool AtspiAccessibleWatcher::executeAndWaitForEvents(const Runnable *cmd, const return false; } +std::map> AtspiAccessibleWatcher::getActiveAppMap(void) +{ + return mActiveAppMap; +} + bool AtspiAccessibleWatcher::removeFromActivatedList(AtspiAccessible *node) { LOGI("remove from activelist node %p", node); diff --git a/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc b/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc index 379a25b..75f4048 100644 --- a/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc +++ b/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc @@ -30,6 +30,10 @@ void MockAccessibleWatcher::addApplication(std::shared_ptr> MockAccessibleWatcher::getActiveAppMap(void) +{ + return mActiveAppMap; +} std::shared_ptr MockAccessibleWatcher::addApplication(std::string pkgName, Rect geometry, int ifaces, int properties) { diff --git a/libaurum/src/UiDevice.cc b/libaurum/src/UiDevice.cc index 23b78ce..0d838ba 100644 --- a/libaurum/src/UiDevice.cc +++ b/libaurum/src/UiDevice.cc @@ -4,7 +4,7 @@ #include "TizenDeviceImpl.h" #endif #include "MockDeviceImpl.h" - +#include "AtspiAccessibleWatcher.h" #include #include #include @@ -50,16 +50,19 @@ std::vector> UiDevice::getWindowRoot() const { std::vector> ret{}; - auto apps = AccessibleWatcher::getInstance()->getActiveApplications(); - for (auto &app : apps){ - auto activeWindows = app->getActiveWindows(); + auto appsMap = AccessibleWatcher::getInstance()->getActiveAppMap(); + LOGI("activeAppMap.size: %d" , appsMap.size()); + for (auto itr = appsMap.begin(); itr != appsMap.end(); itr++) + { + auto activeWindows = itr->second->getActiveWindows(); std::transform(activeWindows.begin(), activeWindows.end(), std::back_inserter(ret), [&](std::shared_ptr window){ - LOGI("Active pkg: %s, window: %s", window->getAccessibleNode()->getPkg().c_str(), window->getTitle().c_str()); + LOGI("active pkg: %s, window: %s", window->getAccessibleNode()->getPkg().c_str(), window->getTitle().c_str()); return window->getAccessibleNode(); } ); } + return ret; } diff --git a/org.tizen.aurum-bootstrap/inc/Commands/LaunchAppCommand.h b/org.tizen.aurum-bootstrap/inc/Commands/LaunchAppCommand.h index a08d30c..c994bf2 100644 --- a/org.tizen.aurum-bootstrap/inc/Commands/LaunchAppCommand.h +++ b/org.tizen.aurum-bootstrap/inc/Commands/LaunchAppCommand.h @@ -16,5 +16,4 @@ public: LaunchAppCommand(const ::aurum::ReqLaunchApp *request, ::aurum::RspLaunchApp *response); ::grpc::Status execute() override; - ::grpc::Status executePost() override; }; \ No newline at end of file diff --git a/org.tizen.aurum-bootstrap/inc/Runnable/LaunchAppRunnable.h b/org.tizen.aurum-bootstrap/inc/Runnable/LaunchAppRunnable.h new file mode 100644 index 0000000..0fe4ca2 --- /dev/null +++ b/org.tizen.aurum-bootstrap/inc/Runnable/LaunchAppRunnable.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#include "Runnable.h" + +class LaunchAppRunnable : public Runnable { +protected: + std::string mPkg; + +public: + LaunchAppRunnable(std::string pkg); + std::string getPkgName(); + void run() const override; +}; diff --git a/org.tizen.aurum-bootstrap/meson.build b/org.tizen.aurum-bootstrap/meson.build index 41d8472..8bb2b35 100644 --- a/org.tizen.aurum-bootstrap/meson.build +++ b/org.tizen.aurum-bootstrap/meson.build @@ -3,12 +3,14 @@ bootstrap_svr_inc = [ root_inc, include_directories('inc'), include_directories('inc/Commands'), + include_directories('inc/Runnable'), ] bootstrap_svr_src = [ files('src/BootstrapServer.cc'), files('src/AurumServiceImpl.cc'), files('src/ObjectMapper.cc'), + files('src/Runnable/LaunchAppRunnable.cc'), ] bootstrap_svr_src += [ diff --git a/org.tizen.aurum-bootstrap/src/Commands/LaunchAppCommand.cc b/org.tizen.aurum-bootstrap/src/Commands/LaunchAppCommand.cc index f7c30ed..f695723 100644 --- a/org.tizen.aurum-bootstrap/src/Commands/LaunchAppCommand.cc +++ b/org.tizen.aurum-bootstrap/src/Commands/LaunchAppCommand.cc @@ -1,11 +1,11 @@ #include "bootstrap.h" #include "LaunchAppCommand.h" +#include "LaunchAppRunnable.h" +#include "UiDevice.h" #include #include -#ifdef GBSBUILD -#include -#endif +#define WAIT_APP_LAUNCH 10000 LaunchAppCommand::LaunchAppCommand(const ::aurum::ReqLaunchApp *request, ::aurum::RspLaunchApp *response) @@ -16,43 +16,9 @@ LaunchAppCommand::LaunchAppCommand(const ::aurum::ReqLaunchApp *request, ::grpc::Status LaunchAppCommand::execute() { LOGI("LaunchApp --------------- "); -#ifdef GBSBUILD - app_control_h appControl; - std::string packageName = mRequest->packagename(); - int ret = -1; + std::unique_ptr cmd = std::make_unique(mRequest->packagename()); + std::shared_ptr obj = UiDevice::getInstance(); + obj->executeAndWaitForEvents(cmd.get(), A11yEvent::EVENT_WINDOW_ACTIVATE, WAIT_APP_LAUNCH); - if (packageName.empty()) return grpc::Status::OK; - - ret = app_control_create(&appControl); - if (ret) { - LOGE("Launch Failed(1/3) Err Code : %ull", ret); - mResponse->set_status(::aurum::RspStatus::ERROR); - return grpc::Status::OK; - } - - ret = app_control_set_app_id(appControl, packageName.c_str()); - if (ret) { - LOGE("Launch Failed(2/3) Err Code : %ull", ret); - mResponse->set_status(::aurum::RspStatus::ERROR); - app_control_destroy(appControl); - return grpc::Status::OK; - } - - ret = app_control_send_launch_request(appControl, NULL, NULL); - if (ret) { - LOGE("Launch Failed(3/3) Err Code : %ull", ret); - mResponse->set_status(::aurum::RspStatus::ERROR); - app_control_destroy(appControl); - return grpc::Status::OK; - } - - app_control_destroy(appControl); -#endif return grpc::Status::OK; -} -::grpc::Status LaunchAppCommand::executePost() -{ - LOGI("Wait for 2500ms"); - std::this_thread::sleep_for(std::chrono::milliseconds{2500}); - return grpc::Status::OK; -} +} \ No newline at end of file diff --git a/org.tizen.aurum-bootstrap/src/Runnable/LaunchAppRunnable.cc b/org.tizen.aurum-bootstrap/src/Runnable/LaunchAppRunnable.cc new file mode 100644 index 0000000..cafa48b --- /dev/null +++ b/org.tizen.aurum-bootstrap/src/Runnable/LaunchAppRunnable.cc @@ -0,0 +1,51 @@ +#include "Aurum.h" +#include "bootstrap.h" +#include "LaunchAppCommand.h" +#include "LaunchAppRunnable.h" + +#ifdef GBSBUILD +#include +#endif + +LaunchAppRunnable::LaunchAppRunnable(std::string pkg) + : mPkg{pkg} +{ +} + +void LaunchAppRunnable::run() const +{ +#ifdef GBSBUILD + app_control_h appControl; + std::string packageName = mPkg; + int ret = -1; + + if (packageName.empty()) return; + + ret = app_control_create(&appControl); + if (ret) { + LOGE("Launch Failed(app_control_create) Err Code : %ull", ret); + return; + } + + ret = app_control_set_app_id(appControl, packageName.c_str()); + if (ret) { + LOGE("Launch Failed(app_control_set_app_id) Err Code : %ull", ret); + app_control_destroy(appControl); + return; + } + + ret = app_control_send_launch_request(appControl, NULL, NULL); + if (ret) { + LOGE("Launch Failed(app_control_send_launch_request) Err Code : %ull", ret); + app_control_destroy(appControl); + return; + } + + app_control_destroy(appControl); +#endif +} + +std::string LaunchAppRunnable::getPkgName() +{ + return mPkg; +} \ No newline at end of file -- 2.34.1