From 97ab04a03a538edf37afe27e1f54bede8621aaf5 Mon Sep 17 00:00:00 2001 From: Woochanlee Date: Thu, 10 Feb 2022 17:38:25 +0900 Subject: [PATCH] libaurum: Introduce setFocus command This command can sets focus to specific ui object. sample usage : ret = stub.setFocus(ReqSetFocus(elementId="ID")) Change-Id: I3d4fbe61620dabc2b5e309f65d6963a97a58e473 --- libaurum/inc/Accessibility/AccessibleNode.h | 5 +++ .../inc/Impl/Accessibility/AtspiAccessibleNode.h | 5 +++ libaurum/inc/Impl/Accessibility/AtspiWrapper.h | 1 + .../inc/Impl/Accessibility/MockAccessibleNode.h | 6 ++++ libaurum/inc/UiObject.h | 7 ++++ .../src/Impl/Accessibility/AtspiAccessibleNode.cc | 12 +++++++ libaurum/src/Impl/Accessibility/AtspiWrapper.cc | 6 ++++ .../src/Impl/Accessibility/MockAccessibleNode.cc | 5 +++ libaurum/src/UiObject.cc | 5 +++ org.tizen.aurum-bootstrap/inc/AurumServiceImpl.h | 3 ++ org.tizen.aurum-bootstrap/inc/Commands/Commands.h | 1 + .../inc/Commands/SetFocusCommand.h | 34 +++++++++++++++++++ org.tizen.aurum-bootstrap/meson.build | 1 + org.tizen.aurum-bootstrap/src/AurumServiceImpl.cc | 8 +++++ .../src/Commands/SetFocusCommand.cc | 39 ++++++++++++++++++++++ protocol/aurum.proto | 9 +++++ 16 files changed, 147 insertions(+) create mode 100644 org.tizen.aurum-bootstrap/inc/Commands/SetFocusCommand.h create mode 100644 org.tizen.aurum-bootstrap/src/Commands/SetFocusCommand.cc diff --git a/libaurum/inc/Accessibility/AccessibleNode.h b/libaurum/inc/Accessibility/AccessibleNode.h index 20373ad..d37377e 100644 --- a/libaurum/inc/Accessibility/AccessibleNode.h +++ b/libaurum/inc/Accessibility/AccessibleNode.h @@ -324,6 +324,11 @@ public: virtual void updateExtents() = 0; /** + * @copydoc UiObject::setFocus() + */ + virtual bool setFocus() = 0; + + /** * @brief Updates Node information from atspi server. * * @since_tizen 6.5 diff --git a/libaurum/inc/Impl/Accessibility/AtspiAccessibleNode.h b/libaurum/inc/Impl/Accessibility/AtspiAccessibleNode.h index dfda9ff..7fb03ff 100644 --- a/libaurum/inc/Impl/Accessibility/AtspiAccessibleNode.h +++ b/libaurum/inc/Impl/Accessibility/AtspiAccessibleNode.h @@ -117,6 +117,11 @@ public: void updateExtents() override; /** + * @copydoc UiObject::setFocus() + */ + bool setFocus() override; + + /** * @copydoc AccessibleNode::refresh() */ void refresh() override; diff --git a/libaurum/inc/Impl/Accessibility/AtspiWrapper.h b/libaurum/inc/Impl/Accessibility/AtspiWrapper.h index b3928fb..5182230 100644 --- a/libaurum/inc/Impl/Accessibility/AtspiWrapper.h +++ b/libaurum/inc/Impl/Accessibility/AtspiWrapper.h @@ -58,6 +58,7 @@ public: static gboolean Atspi_editable_text_insert_text(AtspiEditableText *, int pos, const gchar *text, int len, GError **error); static AtspiAccessible *Atspi_accessible_get_application (AtspiAccessible *node, GError **error); static void Atspi_accessible_clear_cache (AtspiAccessible *node); + static gboolean Atspi_component_grab_focus(AtspiComponent *obj, GError **error); private: static std::recursive_mutex mMutex; diff --git a/libaurum/inc/Impl/Accessibility/MockAccessibleNode.h b/libaurum/inc/Impl/Accessibility/MockAccessibleNode.h index 7286e03..d2d8e5e 100644 --- a/libaurum/inc/Impl/Accessibility/MockAccessibleNode.h +++ b/libaurum/inc/Impl/Accessibility/MockAccessibleNode.h @@ -117,6 +117,12 @@ public: */ void updateExtents() override; + /** + * @brief TBD + * @since_tizen 7.0 + */ + bool setFocus() override; + /** * @brief TBD * @since_tizen 6.5 diff --git a/libaurum/inc/UiObject.h b/libaurum/inc/UiObject.h index 14ab717..8c81b73 100644 --- a/libaurum/inc/UiObject.h +++ b/libaurum/inc/UiObject.h @@ -481,6 +481,13 @@ public: void updateExtents() const; /** + * @brief Sets focus to object. + * + * @since_tizen 7.0 + */ + bool setFocus() const; + + /** * @brief Updates object's information from atspi server. * * @since_tizen 6.5 diff --git a/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc b/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc index 3fa127c..95c4506 100644 --- a/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc +++ b/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc @@ -226,6 +226,18 @@ void AtspiAccessibleNode::updateExtents() } } +bool AtspiAccessibleNode::setFocus() +{ + AtspiComponent *component = AtspiWrapper::Atspi_accessible_get_component_iface(mNode); + if (component) { + bool ret = AtspiWrapper::Atspi_component_grab_focus(component, NULL); + g_object_unref(component); + return ret; + } + else + return false; +} + void AtspiAccessibleNode::refresh() { AtspiWrapper::Atspi_accessible_clear_cache(mNode); diff --git a/libaurum/src/Impl/Accessibility/AtspiWrapper.cc b/libaurum/src/Impl/Accessibility/AtspiWrapper.cc index 6164ffc..fcf94c0 100644 --- a/libaurum/src/Impl/Accessibility/AtspiWrapper.cc +++ b/libaurum/src/Impl/Accessibility/AtspiWrapper.cc @@ -158,3 +158,9 @@ void AtspiWrapper::Atspi_accessible_clear_cache (AtspiAccessible *node) std::unique_lock lock(mMutex); return atspi_accessible_clear_cache(node); } + +gboolean AtspiWrapper::Atspi_component_grab_focus(AtspiComponent *obj, GError **error) +{ + std::unique_lock lock(mMutex); + return atspi_component_grab_focus(obj, error); +} diff --git a/libaurum/src/Impl/Accessibility/MockAccessibleNode.cc b/libaurum/src/Impl/Accessibility/MockAccessibleNode.cc index 2fcce9a..75a46e1 100644 --- a/libaurum/src/Impl/Accessibility/MockAccessibleNode.cc +++ b/libaurum/src/Impl/Accessibility/MockAccessibleNode.cc @@ -109,6 +109,11 @@ void MockAccessibleNode::updateExtents() { } +bool MockAccessibleNode::setFocus() +{ + return false; +} + void MockAccessibleNode::refresh() { } diff --git a/libaurum/src/UiObject.cc b/libaurum/src/UiObject.cc index f4bce91..042171a 100644 --- a/libaurum/src/UiObject.cc +++ b/libaurum/src/UiObject.cc @@ -304,6 +304,11 @@ void UiObject::updateExtents() const mNode->updateExtents(); } +bool UiObject::setFocus() const +{ + return mNode->setFocus(); +} + bool UiObject::isValid() const { return mNode->isValid(); diff --git a/org.tizen.aurum-bootstrap/inc/AurumServiceImpl.h b/org.tizen.aurum-bootstrap/inc/AurumServiceImpl.h index 7a6c971..a471ec4 100644 --- a/org.tizen.aurum-bootstrap/inc/AurumServiceImpl.h +++ b/org.tizen.aurum-bootstrap/inc/AurumServiceImpl.h @@ -113,6 +113,9 @@ public: ::grpc::Status actionAndWaitEvent(::grpc::ServerContext *context, const ::aurum::ReqActionAndWaitEvent *request, ::aurum::RspActionAndWaitEvent *response) override; + ::grpc::Status setFocus(::grpc::ServerContext *context, + const ::aurum::ReqSetFocus *request, + ::aurum::RspSetFocus *response) override; }; #endif diff --git a/org.tizen.aurum-bootstrap/inc/Commands/Commands.h b/org.tizen.aurum-bootstrap/inc/Commands/Commands.h index 754b8eb..c7728d5 100644 --- a/org.tizen.aurum-bootstrap/inc/Commands/Commands.h +++ b/org.tizen.aurum-bootstrap/inc/Commands/Commands.h @@ -47,3 +47,4 @@ #include "Commands/DumpObjectTreeCommand.h" #include "Commands/GetScreenSizeCommand.h" #include "Commands/ActionAndWaitEventCommand.h" +#include "Commands/SetFocusCommand.h" diff --git a/org.tizen.aurum-bootstrap/inc/Commands/SetFocusCommand.h b/org.tizen.aurum-bootstrap/inc/Commands/SetFocusCommand.h new file mode 100644 index 0000000..6df2850 --- /dev/null +++ b/org.tizen.aurum-bootstrap/inc/Commands/SetFocusCommand.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include "Commands/Command.h" +#include "ObjectMapper.h" +#include +#include "config.h" + +class SetFocusCommand : public Command { +private: + const ::aurum::ReqSetFocus *mRequest; + ::aurum::RspSetFocus *mResponse; + +public: + SetFocusCommand(const ::aurum::ReqSetFocus *request, + ::aurum::RspSetFocus *response); + ::grpc::Status execute() override; +}; diff --git a/org.tizen.aurum-bootstrap/meson.build b/org.tizen.aurum-bootstrap/meson.build index 3933f64..62ebd35 100644 --- a/org.tizen.aurum-bootstrap/meson.build +++ b/org.tizen.aurum-bootstrap/meson.build @@ -43,6 +43,7 @@ bootstrap_svr_src += [ files('src/Commands/DumpObjectTreeCommand.cc'), files('src/Commands/GetScreenSizeCommand.cc'), files('src/Commands/ActionAndWaitEventCommand.cc'), + files('src/Commands/SetFocusCommand.cc'), ] bootstrap_svr_dep = [ diff --git a/org.tizen.aurum-bootstrap/src/AurumServiceImpl.cc b/org.tizen.aurum-bootstrap/src/AurumServiceImpl.cc index 32cdec4..ea50a2b 100644 --- a/org.tizen.aurum-bootstrap/src/AurumServiceImpl.cc +++ b/org.tizen.aurum-bootstrap/src/AurumServiceImpl.cc @@ -248,3 +248,11 @@ aurumServiceImpl::~aurumServiceImpl() std::unique_ptr cmd = std::make_unique(request, response); return execute(cmd.get(), true); } + +::grpc::Status aurumServiceImpl::setFocus(::grpc::ServerContext *context, + const ::aurum::ReqSetFocus *request, + ::aurum::RspSetFocus *response) +{ + std::unique_ptr cmd = std::make_unique(request, response); + return execute(cmd.get(), true); +} diff --git a/org.tizen.aurum-bootstrap/src/Commands/SetFocusCommand.cc b/org.tizen.aurum-bootstrap/src/Commands/SetFocusCommand.cc new file mode 100644 index 0000000..061d581 --- /dev/null +++ b/org.tizen.aurum-bootstrap/src/Commands/SetFocusCommand.cc @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "bootstrap.h" +#include "SetFocusCommand.h" +#include "UiObject.h" + +SetFocusCommand::SetFocusCommand(const ::aurum::ReqSetFocus *request, + ::aurum::RspSetFocus *response) + : mRequest{request}, mResponse{response} +{ +} + +::grpc::Status SetFocusCommand::execute() +{ + LOGI("SetFocus --------------- "); + + ObjectMapper *mObjMap = ObjectMapper::getInstance(); + std::shared_ptr obj = mObjMap->getElement(mRequest->elementid()); + if (obj && obj->setFocus()) { + return grpc::Status::OK; + } + + return grpc::Status::CANCELLED; +} diff --git a/protocol/aurum.proto b/protocol/aurum.proto index 1cab347..6b66794 100644 --- a/protocol/aurum.proto +++ b/protocol/aurum.proto @@ -31,6 +31,7 @@ service Bootstrap { rpc dumpObjectTree(ReqDumpObjectTree) returns (RspDumpObjectTree) {} rpc getScreenSize(ReqGetScreenSize) returns (RspGetScreenSize) {} rpc actionAndWaitEvent(ReqActionAndWaitEvent) returns (RspActionAndWaitEvent) {} + rpc setFocus(ReqSetFocus) returns (RspSetFocus) {} } // ------------------------------------ // @@ -452,4 +453,12 @@ message ReqActionAndWaitEvent { message RspActionAndWaitEvent { RspStatus status = 1; +} + +message ReqSetFocus { + string elementId = 1; +} + +message RspSetFocus { + RspStatus status = 1; } \ No newline at end of file -- 2.7.4