Select activity will check UiElement atspi parameters only once 94/148094/4
authorPawel Kurowski <p.kurowski2@samsung.com>
Wed, 6 Sep 2017 18:13:58 +0000 (20:13 +0200)
committerPawel Kurowski <p.kurowski2@samsung.com>
Thu, 7 Sep 2017 14:57:46 +0000 (16:57 +0200)
Since realUiElement can't change during Select activity lifetime,
there is no need to call atspi functions each time.

Change-Id: Ia0442494592fbf7e94d6c9da1a4040612bdfd960

src/SelectActivity.cpp

index 0501ed6..ec39710 100644 (file)
@@ -55,8 +55,8 @@ private:
        std::string getCompleteLabelOfMenu();
        std::string getCompleteLabelOfMainMenu();
        Optional<telephony_call_state_e> getPhoneCallState();
-       bool isUIElementSlider();
-       bool hasUIElementEditableTextIface();
+       bool isRealUIElementSlider();
+       bool hasRealUIElementEditableTextIface();
        std::string getCompleteLabelOfButtonsKeysMenu();
        int addItemsToMenu(Evas_Object *, const std::string &);
 
@@ -73,6 +73,8 @@ private:
        std::stack<VConfInterface::CallbackHandle> callbackHandle;
        std::stack<GengridItemSelectedCbData> gengridItemsSelectedCbData;
        std::shared_ptr<UIElement> realUiElement;
+       Optional<bool> realUiElementIsSlider;
+       Optional<bool> realUiElementHasEditableText;
        std::unique_ptr<Evas_Object, void(*)(Evas_Object *)> popup;
        std::unique_ptr<Evas_Object, void(*)(Evas_Object *)> virtualBackButton;
        VConfInterface::CallbackHandle autoTapWaitingPeriodCallbackHandle;
@@ -130,6 +132,7 @@ void SelectActivity::update(const std::shared_ptr<UIElement> &elem)
 
 void SelectActivity::createMenu()
 {
+       ASSERT(realUiElement, "realUiElement is NULL");
        popup.reset(elm_popup_add(Singleton<UniversalSwitch>::instance().getMainWindow()->getHandler()));
        elm_popup_orient_set(popup.get(), ELM_POPUP_ORIENT_CENTER);
        elm_theme_extension_add(NULL, UNIVERSAL_SWITCH_EDJ);
@@ -252,6 +255,7 @@ void SelectActivity::navigateBack()
 
 void SelectActivity::sendTapActivityChangeRequest()
 {
+       ASSERT(realUiElement, "realUiElement is NULL");
        timer = nullptr;
        completed = true;
        notify(std::make_shared<ActivityChangeRequest>("TAP", realUiElement));
@@ -290,10 +294,10 @@ std::string SelectActivity::getCompleteLabelOfMainMenu()
        if (phoneCallState && *phoneCallState == TELEPHONY_CALL_STATE_CONNECTING)
                return "IDS_MENU_MAIN_INCOMING_CALL";
 
-       if (isUIElementSlider())
+       if (isRealUIElementSlider())
                return "IDS_MENU_MAIN_SLIDER";
 
-       if (hasUIElementEditableTextIface())
+       if (hasRealUIElementEditableTextIface())
                return "IDS_MENU_MAIN_EDITABLE_TEXT";
 
        return "IDS_MENU_MAIN_NORMAL";
@@ -326,23 +330,21 @@ Optional<telephony_call_state_e>  SelectActivity::getPhoneCallState()
        return TELEPHONY_CALL_STATE_IDLE;
 }
 
-bool SelectActivity::isUIElementSlider()
+bool SelectActivity::isRealUIElementSlider() //TODO: Use Atspi wrapper functions when available
 {
-       return realUiElement && atspi_accessible_get_role(realUiElement->getObject().get(), nullptr) == ATSPI_ROLE_SLIDER;
+       if (!realUiElementIsSlider)
+               realUiElementIsSlider = atspi_accessible_get_role(realUiElement->getObject().get(), nullptr) == ATSPI_ROLE_SLIDER;
+       return *realUiElementIsSlider;
 }
 
-bool SelectActivity::hasUIElementEditableTextIface()
+bool SelectActivity::hasRealUIElementEditableTextIface() //TODO: Use Atspi wrapper functions when available
 {
-       if (!realUiElement)
-               return false;
-
-       auto editableTextIface = atspi_accessible_get_editable_text_iface(realUiElement->getObject().get());
-       if (editableTextIface) {
-               g_object_unref(editableTextIface);
-               return true;
+       if (!realUiElementHasEditableText) {
+               auto editableTextIface = std::unique_ptr<AtspiEditableText, void(*)(gpointer)> (atspi_accessible_get_editable_text_iface(realUiElement->getObject().get()), g_object_unref);
+               realUiElementHasEditableText = editableTextIface ? true : false;
        }
 
-       return false;
+       return *realUiElementHasEditableText;
 }
 
 std::string SelectActivity::getCompleteLabelOfButtonsKeysMenu()