[screen reader] Code refactoring: split navigator module 78/239078/7
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>
Tue, 21 Jul 2020 08:59:27 +0000 (10:59 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Wed, 29 Jul 2020 11:42:44 +0000 (13:42 +0200)
 * functions related to "text to read" generation were
   moved to reading composer module

Change-Id: Iba869ddaecf6a0dfa70c89de69df4652083a09b4

CMakeLists.txt
include/navigator.h
include/reading_composer.h [new file with mode: 0644]
include/screen_reader.h
include/utils.h
src/app_tracker.c
src/granularity_read.c
src/navigator.c
src/reading_composer.c [new file with mode: 0644]
src/screen_reader_spi.c
src/utils.c

index 3034022f6760dbe5cd549a208384e63ed853ef2b..38638bfc8e42be52b661222949a7262af15eb100 100755 (executable)
@@ -8,6 +8,7 @@ SET(SRCS ${CMAKE_SOURCE_DIR}/src/app_tracker.c
         ${CMAKE_SOURCE_DIR}/src/flat_navi.c
         ${CMAKE_SOURCE_DIR}/src/main.c
         ${CMAKE_SOURCE_DIR}/src/utils.c
+        ${CMAKE_SOURCE_DIR}/src/reading_composer.c
         ${CMAKE_SOURCE_DIR}/src/screen_reader.c
         ${CMAKE_SOURCE_DIR}/src/screen_reader_haptic.c
         ${CMAKE_SOURCE_DIR}/src/screen_reader_spi.c
index 87778cd219805f4630ab9c9e81b75ad4555aa33f..d385ff8171b27443c95e93af7bed1d1ce5c3ba42 100644 (file)
@@ -2,11 +2,10 @@
 #define NAVIGATOR_H_
 
 #include <atspi/atspi.h>
-#include "screen_reader.h"
-#include "utils.h"
-#include "flat_navi.h"
 
-#define TTS_MAX_TEXT_SIZE  2000
+#include <flat_navi.h>
+#include <screen_reader.h>
+#include <utils.h>
 
 extern bool read_description;
 extern bool haptic;
@@ -34,20 +33,11 @@ void navigator_shutdown(Navigator_Data *nd);
  */
 /* void _widget_scroll(Gesture_Info *gi); */
 
-char *generate_what_to_read(AtspiAccessible *obj);
 void generate_what_to_read_and_speak(Navigator_Data *nd, AtspiAccessible *obj, Eina_Bool associate_object);
 
-int get_accuracy(double val, int max_accuracy);
-
 void navigator_focus_next_visible(Navigator_Data *nd);
 void navigator_focus_prev_visible(Navigator_Data *nd);
 
-unsigned short int navigator_reading_attribute_get(AtspiAccessibleReadingMaterial *rm);
-void navigator_reading_material_free(AtspiAccessibleReadingMaterial *rm);
-
-#define ESAL(buf, txt)\
-       eina_strbuf_append_length(buf, txt, strlen(txt))
-
 void sound_n_vibration_feedback_generate(AtspiAccessible *obj);
 
 /**
diff --git a/include/reading_composer.h b/include/reading_composer.h
new file mode 100644 (file)
index 0000000..aaaf696
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef READING_COMPOSER_H_
+#define READING_COMPOSER_H_
+
+#include <atspi/atspi.h>
+
+#define TTS_MAX_TEXT_SIZE  2000
+
+unsigned short int reading_composer_reading_attribute_get(
+               AtspiAccessibleReadingMaterial *rm);
+
+void reading_composer_reading_material_free(AtspiAccessibleReadingMaterial *rm);
+
+/* 
+ * @brief This function should return "physical" textual representation o UI element,
+ *        that is, what is explicitly rendered in GUI as text, directly for the given
+ *        object or for other object connected via relation LABELED_BY
+ */
+char* reading_composer_name_get(AtspiAccessible *obj);
+
+/*
+ * @brief Similar to reading_composer_name_get but enriches above definition with
+ *        "static" metadata which is not rendered in GUI, such as role name, etc.
+ */
+char* reading_composer_description_get(AtspiAccessible *obj);
+
+/*
+ * @brief This function provides only "dynamic" metadata describing what
+ *        user interactions are possible for given UI element. This mapps
+ *        to A11Y "description" attribute.
+ */
+void reading_composer_extended_description_get(
+               AtspiAccessible *obj,
+               char **base_desc,
+               char **ext_desc);
+
+#endif
+
index 0ddf5c6cf716a87f79f13c20331f609beec0ea75..24803ff844ed03286de52e3c643312759819576c 100644 (file)
@@ -20,8 +20,6 @@
 #define TEXT_DELETE_SIG "object:text-changed:delete"
 #define STATE_CHECKED_SIG "object:state-changed:checked"
 
-#define SCREEN_READER_SAFE_FREE(_h, _fn) do { _fn((void*)_h); _h = NULL; } while (0)
-
 typedef enum {
        read_as_xml,
        read_as_plain,
index af29df4a805b856397d2fc6bb70778e880a154e3..0275ad546db472c669bfdfb261f58b726b52319a 100644 (file)
 #include <Eldbus.h>
 #include <atspi/atspi.h>
 
+#define ESAL(buf, txt)\
+       eina_strbuf_append_length(buf, txt, strlen(txt))
+
+#define SCREEN_READER_SAFE_FREE(_h, _fn) do { _fn((void*)_h); _h = NULL; } while (0)
+
+#define HOVERSEL_TRAIT_SIZE 200
+
 /**
  * @brief Accessibility gestures
  */
@@ -108,4 +115,7 @@ Eina_Bool object_has_modal_role(AtspiRole role);
 Eina_Bool object_has_defunct_state(AtspiAccessible *obj);
 Eina_Bool object_has_highlighted_state(AtspiAccessible *obj);
 
+int get_accuracy(double val, int max_accuracy);
+
 #endif /* UTILS_H_ */
+
index 7e2423c1ac234a633da075576e2c429af07662d6..2d7a84e7460a3c9c03bc285450a64acff945495e 100644 (file)
@@ -18,6 +18,7 @@
 #include <app_tracker.h>
 #include <logger.h>
 #include <navigator.h>
+#include <reading_composer.h>
 #include <screen_reader_tts.h>
 #include <symbols.h>
 #include <utils.h>
@@ -343,7 +344,7 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                                }
                                if (window_tracker_subroot_get(atd->window_tracker_data)) {
                                        char *text_to_speak = NULL;
-                                       text_to_speak = generate_what_to_read(event->source);
+                                       text_to_speak = reading_composer_description_get(event->source);
                                        DEBUG("SPEAK : %s", text_to_speak ? text_to_speak : "text_to_speak nil");
                                        tts_speak_customized(text_to_speak, EINA_TRUE, EINA_TRUE, event->source, 0);
                                        free(text_to_speak);
index f4e6ffa3c280f736162b2b3fc0bd06c2989d70ee..99d63a0e981c3c2f840c484a8417c9d4a81ef2ff 100644 (file)
  */
 
 #define _GNU_SOURCE
-#include <stdio.h>
+#include <atspi/atspi.h>
 #include <Ecore.h>
 #include <Elementary.h>
-#include <atspi/atspi.h>
-#include "utils.h"
-#include "logger.h"
-#include "navigator.h"
-#include "smart_notification.h"
-#include "screen_reader_tts.h"
-#include "granularity_read.h"
+#include <stdio.h>
+
+#include <granularity_read.h>
+#include <logger.h>
+#include <reading_composer.h>
+#include <screen_reader_tts.h>
+#include <smart_notification.h>
+#include <utils.h>
 
 Ecore_Timer *granularity_read_popup_timer;
 
@@ -231,53 +232,6 @@ void granularity_read_text_list_init()
        DEBUG("END");
 }
 
-char *_current_object_accessible_name_get(AtspiAccessible *obj)
-{
-       DEBUG("START");
-       AtspiAccessibleReadingMaterial *rm;
-       Eina_Strbuf *buf;
-       char *name = NULL;
-       char *name_from_relation = NULL;
-       char *text = NULL;
-       char *ret = NULL;
-
-       if (!obj)
-               return NULL;
-       rm = atspi_accessible_get_reading_material(obj, NULL);
-       if (!rm)
-               return NULL;
-       unsigned short reading_attribute = navigator_reading_attribute_get(rm);
-
-       buf = eina_strbuf_new();
-       if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_NAME) {
-               DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_NAME");
-               name = rm->name;
-               name_from_relation = rm->labeled_by_name;
-               text = rm->text_interface_name;
-
-               if (text && strlen(text))
-                       ESAL(buf, text);
-               if (name && strlen(name) > 0) {
-                       if (eina_strbuf_length_get(buf))
-                               eina_strbuf_append_char(buf, ',');
-                       ESAL(buf, name);
-               }
-               if (name_from_relation && strlen(name_from_relation) > 0) {
-                       if (eina_strbuf_length_get(buf))
-                               eina_strbuf_append_char(buf, ',');
-                       ESAL(buf, name_from_relation);
-               }
-               DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_NAME");
-       }
-
-       ret = eina_strbuf_string_steal(buf);
-       eina_strbuf_free(buf);
-       navigator_reading_material_free(rm);
-       DEBUG("RESULT: %s", ret);
-       DEBUG("END");
-       return ret;
-}
-
 char *granularity_read_text_get(AtspiAccessible *current_obj, Eina_Bool next)
 {
        DEBUG("START");
@@ -292,7 +246,7 @@ char *granularity_read_text_get(AtspiAccessible *current_obj, Eina_Bool next)
                granularity_read_text_list_init();
 
                grd->current_obj = current_obj;
-               grd->current_text = _current_object_accessible_name_get(grd->current_obj);
+               grd->current_text = reading_composer_name_get(grd->current_obj);
                if (grd->current_text)
                        _read_text_list_make(grd->current_text);
        }
index f68da833cce56ed5e75bf0ae7fc5b4c2d7479824..78014ebe0ffc94e435018c8a08297fda3d7bbcaa 100644 (file)
 #include "granularity_read.h"
 #include "utils.h"
 #include "symbols.h"
-
-#define QUICKPANEL_DOWN TRUE
-#define QUICKPANEL_UP FALSE
-
-#define DISTANCE_NB 8
-#define MENU_ITEM_TAB_INDEX_SIZE 16
-#define HOVERSEL_TRAIT_SIZE 200
+#include "reading_composer.h"
 
 #define HAPTIC_VIBRATE_DURATION 30
 #define HAPTIC_VIBRATE_INTENSITY 50
@@ -55,9 +49,6 @@
 
 #define DEBUG_MODE
 
-#define STATE_SET_CONTAINS(states, state)\
-       ((states & ((gint64)1 << state)) ? (EINA_TRUE) : (EINA_FALSE))
-
 static void _highlight_on_slider(Eina_Bool is_slider);
 
 typedef struct {
@@ -102,7 +93,6 @@ struct _Navigator_Data {
 
 static Eldbus_Connection *connection = NULL;
 
-extern bool read_description;
 extern bool haptic;
 extern bool sound_feedback;
 
@@ -322,24 +312,6 @@ fail_obj:
 
 }
 
-static void display_info_about_object(AtspiAccessibleReadingMaterial *rm)
-{
-       DEBUG("START");
-       DEBUG("------------------------");
-       DEBUG("NAME:%s", rm->name);
-       DEBUG("TEXT IFACE NAME:%s", rm->text_interface_name);
-       DEBUG("DESCRIPTION:%s", rm->description);
-       DEBUG("ROLE:%s", rm->localized_role_name);
-       DEBUG("CHILDS:%d", rm->child_count);
-       DEBUG("INDEX IN PARENT:%d", rm->index_in_parent);
-       DEBUG("VALUE:%f", rm->value);
-       DEBUG("VALUE MAX:%f", rm->upper);
-       DEBUG("VALUE MIN:%f", rm->lower);
-       DEBUG("STATES:");
-       DEBUG("------------------------");
-       DEBUG("END");
-}
-
 static bool _widget_has_state(AtspiAccessible *obj, AtspiStateType type)
 {
        Eina_Bool ret = EINA_FALSE;
@@ -350,613 +322,6 @@ static bool _widget_has_state(AtspiAccessible *obj, AtspiStateType type)
        return ret;
 }
 
-int get_accuracy(double val, int max_accuracy)
-{
-       char val_str[HOVERSEL_TRAIT_SIZE] = "";
-       int position;
-       int accuracy;
-
-       g_snprintf(val_str, HOVERSEL_TRAIT_SIZE, "%.*f", max_accuracy, val);
-       accuracy = max_accuracy;
-       position = strlen(val_str) - 1;
-       while (position > 0 && val_str[position] == '0') {
-               --position;
-               --accuracy;
-       }
-       return accuracy;
-}
-
-void add_slider_description(Eina_Strbuf *buf, AtspiAccessibleReadingMaterial *rm)
-{
-       char trait[HOVERSEL_TRAIT_SIZE] = "";
-
-       int accuracy = get_accuracy(rm->increment, 3);
-
-       double add_for_rounding = 0.5f;
-       int mul_for_rounding = 1;
-       int count = 0;
-       for (count = 0; count < accuracy; count++) {
-               add_for_rounding *= 0.1f;
-               mul_for_rounding *= 10;
-       }
-
-       int val = (int)((rm->value + add_for_rounding) * mul_for_rounding);
-       int max_val = (int)((rm->upper + add_for_rounding) * mul_for_rounding);
-       int min_val = (int)((rm->lower + add_for_rounding) * mul_for_rounding);
-
-       int percent = ((val - min_val) / (double)(abs(max_val - min_val))) * 100;
-       char buf_percent[64] = "\0";
-
-       g_snprintf(buf_percent, sizeof(buf_percent), "%d", percent);
-       SUPPRESS_FORMAT_ERROR(g_snprintf(trait, sizeof(trait), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf_percent));
-
-       if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED))
-               g_snprintf(trait + strlen(trait), sizeof(trait) - strlen(trait), " , %s", _IGNORE_ON_TV("IDS_TPLATFORM_BODY_FLICK_UP_AND_DOWN_TO_ADJUST_THE_POSITION_T_TTS"));
-       ESAL(buf, trait);
-}
-
-char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
-{
-       AtspiRole role = rm->role;
-       char ret[TTS_MAX_TEXT_SIZE] = { [TTS_MAX_TEXT_SIZE - 1] = 0 };
-       switch (role) {
-       case ATSPI_ROLE_ENTRY:
-       case ATSPI_ROLE_PASSWORD_TEXT: {
-               AtspiAccessible *parent = rm->parent;
-               if (parent) {
-                       AtspiRole parent_role = rm->parent_role;
-                       if (parent_role == ATSPI_ROLE_SPIN_BUTTON && STATE_SET_CONTAINS(rm->states, ATSPI_STATE_FOCUSED))
-                               break;
-               }
-               g_snprintf(ret, sizeof(ret), "%s", _("IDS_TPLATFORM_BODY_EDIT_FIELD_M_NOUN_T_TTS"));
-               break;
-       }
-       case ATSPI_ROLE_COMBO_BOX: {
-               int children_count = rm->child_count;
-               char buf[TTS_MAX_TEXT_SIZE] = "";
-               g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
-               SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
-               g_strlcat(ret, " ", sizeof(ret) - strlen(ret) - 1);
-               g_strlcat(ret, buf, sizeof(ret) - strlen(ret) - 1);
-               break;
-       }
-       case ATSPI_ROLE_GLASS_PANE: {
-               AtspiAccessible *parent = rm->parent;
-               if (parent) {
-                       int children_count = rm->parent_child_count;
-                       char buf[TTS_MAX_TEXT_SIZE] = "";
-                       g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
-                       SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
-                       g_strlcat(ret, " ", sizeof(ret) - strlen(ret) - 1);
-                       g_strlcat(ret, buf, sizeof(ret) - strlen(ret) - 1);
-               }
-               break;
-       }
-       case ATSPI_ROLE_LIST_ITEM: {
-               AtspiAccessible *parent = rm->parent;
-               if (parent) {
-                       if (STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_ANIMATED)) {
-                               g_strlcpy(ret, _("IDS_GALLERY_OPT_REORDER"), sizeof(ret) - 1);
-                               g_strlcat(ret, " , ", sizeof(ret) - strlen(ret) - 1);
-                               g_strlcat(ret, _("IDS_ACCS_BODY_BUTTON_TTS"), sizeof(ret) - strlen(ret) - 1);
-                       }
-               }
-               break;
-       }
-       case ATSPI_ROLE_PUSH_BUTTON: {
-               g_strlcpy(ret, _("IDS_ACCS_BODY_BUTTON_TTS"), sizeof(ret) - 1);
-               break;
-       }
-       case ATSPI_ROLE_PROGRESS_BAR: {
-               double val = rm->value;
-               if (val > 0) {
-                       char buf[255];
-                       g_snprintf(buf, sizeof(buf), "%.0f", val * 100);
-                       SUPPRESS_FORMAT_ERROR(g_snprintf(ret, sizeof(ret), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf));
-               }
-               break;
-       }
-       case ATSPI_ROLE_SLIDER: {
-               gchar *role_name = rm->localized_role_name;
-               if (role_name)
-                       g_strlcat(ret, role_name, sizeof(ret) - strlen(ret) - 1);
-               break;
-       }
-       case ATSPI_ROLE_SCROLL_BAR: {
-               GHashTable *hash_table = rm->attributes;
-               if (hash_table) {
-                       const char *style = g_hash_table_lookup(hash_table, "style");
-                       if (!g_strcmp0(style, "default"))
-                               g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_TBOPT_ALPHABETICAL_INDEX_BAR"));
-               }
-               break;
-       }
-       case ATSPI_ROLE_INVALID:
-       case ATSPI_ROLE_TOGGLE_BUTTON:
-       case ATSPI_ROLE_HEADING:
-       case ATSPI_ROLE_PAGE_TAB:
-       case ATSPI_ROLE_EDITBAR:
-       case ATSPI_ROLE_CHECK_BOX:
-       case ATSPI_ROLE_MENU_ITEM:
-       case ATSPI_ROLE_RADIO_MENU_ITEM:
-       case ATSPI_ROLE_RADIO_BUTTON:
-       case ATSPI_ROLE_POPUP_MENU:
-       case ATSPI_ROLE_DIALOG:
-       case ATSPI_ROLE_UNKNOWN:
-       case ATSPI_ROLE_GROUPING: {
-               break;
-       }
-       default: {
-               gchar *role_name = rm->localized_role_name;
-               if (role_name)
-                       g_strlcpy(ret, role_name, sizeof(ret) - 1);
-       }
-       }
-
-       return g_strdup(ret);
-}
-
-char *generate_description_trait(AtspiAccessibleReadingMaterial *rm)
-{
-       DEBUG("START");
-       AtspiRole role = rm->role;
-       char *ret = NULL;
-       Eina_Strbuf *buf;
-
-       buf = eina_strbuf_new();
-       switch (role) {
-       case ATSPI_ROLE_ENTRY:
-       case ATSPI_ROLE_PASSWORD_TEXT: {
-               if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE)) break;
-               if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_FOCUSED))
-                       ESAL(buf, _("IDS_ST_BODY_EDITING_T_TTS"));
-               else
-                       ESAL(buf, _IGNORE_ON_TV("IDS_ST_BODY_DOUBLE_TAP_TO_ENTER_TEXT_T_TTS"));
-               break;
-       }
-       case ATSPI_ROLE_MENU_ITEM: {
-               AtspiAccessible *parent = rm->parent;
-               if (!parent) break;
-               AtspiRole parent_role = rm->parent_role;
-               if (parent_role == ATSPI_ROLE_TOOL_BAR) {
-                       int children_count = rm->parent_child_count;
-                       int index = rm->index_in_parent;
-                       AtspiSelection *selection = atspi_accessible_get_selection_iface(parent);
-                       gboolean is_selected = rm->is_selected_in_parent;
-                       SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_ACCS_BODY_TAB_P1SD_OF_P2SD"), index + 1, children_count));
-                       if (!is_selected) {
-                               ESAL(buf, " , ");
-                               ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_SELECT_TTS"));
-                       }
-                       g_object_unref(selection);
-               }
-               break;
-       }
-       case ATSPI_ROLE_LIST_ITEM: {
-               AtspiAccessible *parent = rm->parent;
-               if (!parent) break;
-               AtspiRole parent_role = rm->parent_role;
-               if (parent_role == ATSPI_ROLE_TREE_TABLE) {
-                       ESAL(buf, _("IDS_BR_BODY_IMAGE_T_TTS"));
-
-                       bool is_parent_multiselectable = STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_MULTISELECTABLE);
-
-                       if (is_parent_multiselectable) {
-                               int selected_children_count = rm->parent_selected_child_count;
-                               SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_SCR_BODY_PD_SELECTED_IN_TOTAL_TTS"), selected_children_count));
-                       }
-               } else if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDABLE)
-                                  && (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDED) || STATE_SET_CONTAINS(rm->states, ATSPI_STATE_COLLAPSED))) {
-                       //ELM_GENLIST_ITEM_GROUP
-                       ESAL(buf, _("IDS_AM_OPT_HEADER_TTS"));
-                       //Genlist group & tree item have checkbox
-                       int children_count = rm->child_count;
-                       if (children_count > 0) {
-                               if (rm->has_checkbox_child) {
-                                       ESAL(buf, " , ");
-                                       ESAL(buf, _("IDS_SCR_TBOPT_TICKBOX_FOR_ENTIRE_GROUP"));
-                               }
-                       }
-               } else if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDABLE)) {
-                       //ELM_GENLIST_ITEM_TREE
-                       ESAL(buf, _("IDS_AM_OPT_HEADER_TTS"));
-                       ESAL(buf, " , ");
-                       ESAL(buf, _("IDS_TPLATFORM_BODY_EXPANDABLE_LIST"));
-                       if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDED)) {
-                               ESAL(buf, " , ");
-                               ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_COLLAPSE_THE_LIST_T_TTS"));
-                       } else {
-                               ESAL(buf, " , ");
-                               ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_EXPAND_THE_LIST_T_TTS"));
-                       }
-                       //ELM_GENLIST_ITEM_GROUP
-                       //Genlist group & tree item have checkbox
-                       int children_count = rm->child_count;
-                       if (children_count > 0) {
-                               if (rm->has_checkbox_child) {
-                                       ESAL(buf, " , ");
-                                       ESAL(buf, _("IDS_SCR_TBOPT_TICKBOX_FOR_ENTIRE_GROUP"));
-                               }
-                       }
-               } else if (STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_ANIMATED)) {
-                       ESAL(buf, _IGNORE_ON_TV("IDS_BR_BODY_DOUBLE_TAP_AND_HOLD_THEN_DRAG_TO_REORDER_TTS"));
-               }
-               break;
-       }
-       case ATSPI_ROLE_POPUP_MENU: {
-               int children_count;
-               AtspiAccessible *parent = rm->parent;
-               if (!parent) break;
-               AtspiRole parent_role = rm->parent_role;
-               if (parent_role == ATSPI_ROLE_COMBO_BOX) break;
-               children_count = rm->child_count;
-               SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
-               break;
-       }
-       case ATSPI_ROLE_DIALOG: {
-               int children_count = rm->list_children_count;
-               if (children_count > 0)
-                       SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
-               break;
-       }
-       case ATSPI_ROLE_COMBO_BOX:
-       case ATSPI_ROLE_GLASS_PANE: {
-               ESAL(buf, _IGNORE_ON_TV("IDS_ST_BODY_DOUBLE_TAP_TO_OPEN_THE_MENU_T_TTS"));
-               break;
-       }
-       case ATSPI_ROLE_CHECK_BOX:
-       case ATSPI_ROLE_RADIO_BUTTON: {
-               AtspiAccessible *parent;
-               parent = rm->parent;
-               if (!parent) break;
-               if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED) && STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE))
-                       ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_EDIT_T_TTS"));
-               //Role name should not be read for radio button, color selector, multibuttonentry items
-               break;
-       }
-       case ATSPI_ROLE_PROGRESS_BAR: {
-               ESAL(buf, _("IDS_ACCS_TBBODY_IN_PROGRESS"));
-               break;
-       }
-       case ATSPI_ROLE_SLIDER: {
-               add_slider_description(buf, rm);
-               break;
-       }
-       case ATSPI_ROLE_SCROLL_BAR: {
-               GHashTable *hash_table = rm->attributes;
-               if (hash_table) {
-                       const char *style = g_hash_table_lookup(hash_table, "style");
-                       if (!g_strcmp0(style, "pagecontrol")) {
-                               int child_count = rm->child_count;
-                               int idx = rm->first_selected_child_index;
-                               SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_ACCS_POP_PAGE_P1SD_OF_P2SD_M_DESCRIPTIVE_FORM_TTS"), idx + 1, child_count));
-                       } else {
-                               ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_TBBODY_SWIPE_RIGHT_OR_LEFT_WITH_ONE_FINGER_TO_SELECT_NEXT_OR_PREVIOUS_LETTER"));
-                       }
-               }
-               break;
-       }
-       default:
-               break;
-       }
-
-       ret = eina_strbuf_string_steal(buf);
-       eina_strbuf_free(buf);
-       DEBUG("END");
-       return ret;
-}
-
-char *generate_state_trait(AtspiAccessibleReadingMaterial *rm)
-{
-       AtspiRole role = rm->role;
-       char ret[TTS_MAX_TEXT_SIZE] = "\0";
-       switch (role) {
-       case ATSPI_ROLE_LIST_ITEM: {
-               AtspiAccessible *parent = rm->parent;
-               if (!parent) break;
-               AtspiRole parent_role = rm->parent_role;
-               if (parent_role == ATSPI_ROLE_TREE_TABLE) {
-                       gboolean is_selected = STATE_SET_CONTAINS(rm->states, ATSPI_STATE_SELECTED);
-                       if (is_selected)
-                               g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
-               }
-               break;
-       }
-       case ATSPI_ROLE_CHECK_BOX:
-       case ATSPI_ROLE_RADIO_BUTTON: {
-               AtspiAccessible *parent;
-               AtspiRole parent_role;
-               parent = rm->parent;
-               if (!parent) break;
-               parent_role = rm->parent_role;
-               if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED))
-                       g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
-               else if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE) && (parent_role != ATSPI_ROLE_COLOR_CHOOSER))
-                       g_strlcpy(ret, _("IDS_ACCS_OPT_NOT_SELECTED_TTS"), sizeof(ret) - 1);
-               //Role name should not be read for radio button, color selector, multibuttonentry items
-               break;
-       }
-       case ATSPI_ROLE_TOGGLE_BUTTON: {
-               if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED))
-                       g_strlcpy(ret, _("IDS_MSG_BODY_ON_T_TTS"), sizeof(ret) - 1);
-               else
-                       g_strlcpy(ret, _("IDS_STORYALBUM_BODY_OFF_T_TTS"), sizeof(ret) - 1);
-               break;
-       }
-       case ATSPI_ROLE_RADIO_MENU_ITEM: {
-               g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
-               break;
-       }
-       default:
-               break;
-       }
-
-       return g_strdup(ret);
-}
-
-char *generate_text_for_relation_objects(AtspiAccessible *obj, AtspiRelationType search, char *(*text_generate_cb)(AtspiAccessible *obj))
-{
-       GError *err = NULL;
-       GArray *relations;
-       AtspiRelation *relation;
-       AtspiRelationType type;
-       int i;
-       char *ret = NULL;
-
-       if (!obj || !text_generate_cb) return NULL;
-
-       relations = atspi_accessible_get_relation_set(obj, &err);
-       if (err || !relations) {
-               if (err) g_error_free(err);
-               return NULL;
-       }
-
-       for (i = 0; i < relations->len; i++) {
-               relation = g_array_index(relations, AtspiRelation *, i);
-               type = atspi_relation_get_relation_type(relation);
-               if (type == search) {
-                       gint last_index = atspi_relation_get_n_targets(relation) - 1;
-                       AtspiAccessible *target = atspi_relation_get_target(relation, last_index);
-                       ret = text_generate_cb(target);
-                       g_object_unref(target);
-                       break;
-               }
-               g_object_unref(relation);
-       }
-       g_array_free(relations, TRUE);
-
-       return ret;
-}
-
-static char *generate_description_from_relation_object(AtspiAccessibleReadingMaterial *rm)
-{
-       char *trait = NULL;
-       Eina_Strbuf *buf;
-       char *role_name = generate_role_trait(rm);
-       char *description_from_role = NULL;
-       char *state_from_role = generate_state_trait(rm);
-
-       buf = eina_strbuf_new();
-       if (role_name && strlen(role_name) > 0)
-               ESAL(buf, role_name);
-
-       if (read_description)
-               description_from_role = generate_description_trait(rm);
-       if (description_from_role && strlen(description_from_role) > 0) {
-               if (eina_strbuf_length_get(buf))
-                       ESAL(buf, " , ");
-               ESAL(buf, description_from_role);
-       }
-
-       if (state_from_role && strlen(state_from_role) > 0) {
-               if (eina_strbuf_length_get(buf))
-                       ESAL(buf, " , ");
-               ESAL(buf, state_from_role);
-       }
-       SCREEN_READER_SAFE_FREE(role_name, free);
-       SCREEN_READER_SAFE_FREE(description_from_role, free);
-       SCREEN_READER_SAFE_FREE(state_from_role, free);
-
-       if (rm->description && strlen(rm->description) > 0)
-               eina_strbuf_prepend_printf(buf, "%s , ", rm->description);
-
-       trait = eina_strbuf_string_steal(buf);
-       eina_strbuf_free(buf);
-       return trait;
-}
-
-unsigned short int navigator_reading_attribute_get(AtspiAccessibleReadingMaterial *rm)
-{
-       unsigned short int attribute = 0;
-       gchar *reading_info = NULL;
-       GHashTable *hash_table = rm->attributes;
-       if (hash_table) {
-               reading_info = g_hash_table_lookup(hash_table, "reading_info_type");
-               if (reading_info) {
-                       unsigned int n = 0;
-                       char **list = eina_str_split_full(reading_info, "|", 100, &n);
-                       if (list) {
-                               int i;
-                               for (i = 0; i < n; i++) {
-                                       if (!g_strcmp0(list[i], "name"))
-                                               attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_NAME);
-                                       else if (!g_strcmp0(list[i], "role"))
-                                               attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_ROLE);
-                                       else if (!g_strcmp0(list[i], "description"))
-                                               attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-                                       else if (!g_strcmp0(list[i], "state"))
-                                               attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_STATE);
-                               }
-                               g_free(list[0]);
-                               g_free(list);
-                       }
-               }
-       }
-       if (!hash_table || !reading_info) {
-               attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_NAME) |
-                                       (ACCESSIBLE_READING_INFO_TYPE_ROLE) | (ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION) | (ACCESSIBLE_READING_INFO_TYPE_STATE);
-       }
-
-       return attribute;
-}
-
-void navigator_reading_material_free(AtspiAccessibleReadingMaterial *rm)
-{
-       if (rm->parent)
-               g_object_unref(rm->parent);
-
-       if (rm->described_by_accessible)
-               g_object_unref(rm->described_by_accessible);
-
-       g_hash_table_unref(rm->attributes);
-       g_free(rm->name);
-       g_free(rm->labeled_by_name);
-       g_free(rm->text_interface_name);
-       g_free(rm->localized_role_name);
-       g_free(rm->description);
-       g_free(rm);
-}
-
-void generate_what_to_read_impl(char **ret, char **description_ret, AtspiAccessible *obj)
-{
-       if(ret)
-               *ret = NULL;
-       if(description_ret)
-               *description_ret = NULL;
-       DEBUG("START");
-       char *name = NULL;
-       char *description = NULL;
-       char *role_name = NULL;
-       Eina_Strbuf *buf = NULL, *buf2 = NULL;
-       char *description_from_relation = NULL;
-       char *name_from_relation = NULL;
-       char *name_from_text_iface = NULL;
-       char *description_from_role = NULL;
-       char *state_from_role = NULL;
-       AtspiAccessibleReadingMaterial *rm;
-
-       if (!obj) return;
-
-       rm = atspi_accessible_get_reading_material(obj, NULL);
-       if (!rm)  return;
-
-       display_info_about_object(rm);
-
-       unsigned short reading_attribute = navigator_reading_attribute_get(rm);
-
-       buf = eina_strbuf_new();
-       buf2 = description_ret ? eina_strbuf_new() : buf2;
-       if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_NAME) {
-               DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_NAME");
-               name = rm->name;
-               name_from_relation = rm->labeled_by_name;
-               name_from_text_iface = rm->text_interface_name;
-
-               if (name && strlen(name) > 0)
-                       ESAL(buf, name);
-               if (name_from_relation && strlen(name_from_relation) > 0) {
-                       if (eina_strbuf_length_get(buf))
-                               ESAL(buf, " , ");
-                       ESAL(buf, name_from_relation);
-               }
-               /* For text object on WEB page which does not have accessible name */
-               /* And for password entry which does not have accessible name */
-               if (eina_strbuf_length_get(buf) == 0 && name_from_text_iface) {
-                       unsigned int text_len = strlen(name_from_text_iface);
-                       if (text_len > 0) {
-                               DEBUG("Object has text interface value only");
-                               if (rm->role == ATSPI_ROLE_PASSWORD_TEXT) {
-                                       SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf,
-                                                                                 ngettext("PLURAL_ZERO_ACCS_TBOPT_PD_CHARACTERS",
-                                                                                                  "PLURAL_ZERO_ACCS_TBOPT_PD_CHARACTERS", text_len),
-                                                                                 text_len));
-                               } else {
-                                       ESAL(buf, name_from_text_iface);
-                               }
-                       }
-               }
-               DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_NAME");
-       }
-       if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_ROLE) {
-               DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_ROLE");
-               role_name = generate_role_trait(rm);
-               if (role_name && strlen(role_name) > 0) {
-                       if (eina_strbuf_length_get(buf))
-                               ESAL(buf, " , ");
-                       ESAL(buf, role_name);
-               }
-               SCREEN_READER_SAFE_FREE(role_name, free);
-               DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_ROLE");
-       }
-       /* read_description: if description reading is enabled */
-       if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION) {
-               /* read_description is determined by vconf value for the 'read usage hints aloud' */
-               DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION (read usage hints: %d)", read_description);
-               description = rm->description;
-               /* If description is set by application side, do not read other default information */
-               if (read_description && description && strlen(description) > 0) {
-                       if (eina_strbuf_length_get(buf2))
-                               ESAL(buf2, " , ");
-                       ESAL(buf2, description);
-               } else if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED)) {
-                       if (read_description)
-                               description_from_role = generate_description_trait(rm);
-
-                       if (rm->described_by_accessible) {
-                               AtspiAccessibleReadingMaterial *_rm = atspi_accessible_get_reading_material(rm->described_by_accessible, NULL);
-                               if (_rm) {
-                                       description_from_relation = generate_description_from_relation_object(_rm);
-                                       navigator_reading_material_free(_rm);
-                               }
-                       }
-
-                       if (description_from_role && strlen(description_from_role) > 0) {
-                               if (eina_strbuf_length_get(buf2))
-                                       ESAL(buf2, " , ");
-                               ESAL(buf2, description_from_role);
-                       }
-                       if (description_from_relation && strlen(description_from_relation)) {
-                               if (eina_strbuf_length_get(buf2))
-                                       ESAL(buf2, " , ");
-                               ESAL(buf2, description_from_relation);
-                       }
-               }
-               SCREEN_READER_SAFE_FREE(description_from_relation, free);
-               SCREEN_READER_SAFE_FREE(description_from_role, free);
-               DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION");
-       }
-       if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_STATE) {
-               DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_STATE");
-               state_from_role = generate_state_trait(rm);
-               if (state_from_role && strlen(state_from_role) > 0) {
-                       if (eina_strbuf_length_get(buf))
-                               ESAL(buf, " , ");
-                       ESAL(buf, state_from_role);
-               }
-               if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED)) {
-                       if (eina_strbuf_length_get(buf))
-                               ESAL(buf, " , ");
-                       ESAL(buf, _("IDS_ACCS_BODY_DISABLED_TTS"));
-               }
-               SCREEN_READER_SAFE_FREE(state_from_role, free);
-               DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_STATE");
-       }
-
-       //ret = eina_strbuf_string_steal(buf);
-       DEBUG("RESULT: %s", eina_strbuf_string_get(buf));
-       DEBUG("RESULT description: %s", eina_strbuf_string_get(buf2));
-       if(ret)
-               *ret = eina_strbuf_string_steal(buf);
-       if (description_ret)
-               *description_ret = eina_strbuf_string_steal(buf2);
-
-       eina_strbuf_free(buf);
-       if (buf != buf2)
-               eina_strbuf_free(buf2);
-       navigator_reading_material_free(rm);
-       DEBUG("END");
-}
-
 void generate_what_to_read_and_speak(Navigator_Data *nd, AtspiAccessible *obj, Eina_Bool associate_object)
 {
        char *tmp1, *tmp2;
@@ -966,7 +331,7 @@ void generate_what_to_read_and_speak(Navigator_Data *nd, AtspiAccessible *obj, E
                return;
        }
 
-       generate_what_to_read_impl(&tmp1, &tmp2, obj);
+       reading_composer_extended_description_get(obj, &tmp1, &tmp2);
 
        DEBUG("reading %s", tmp1);
        DEBUG("reading description %s", tmp2);
@@ -977,13 +342,6 @@ void generate_what_to_read_and_speak(Navigator_Data *nd, AtspiAccessible *obj, E
        g_free(tmp2);
 }
 
-char *generate_what_to_read(AtspiAccessible *obj)
-{
-       char *tmp;
-       generate_what_to_read_impl(&tmp, NULL, obj);
-       return tmp;
-}
-
 static Eina_Bool _do_action(AtspiAccessible *obj, char *expected_action)
 {
        AtspiAction *action;
diff --git a/src/reading_composer.c b/src/reading_composer.c
new file mode 100644 (file)
index 0000000..6442259
--- /dev/null
@@ -0,0 +1,645 @@
+#include <atspi/atspi.h>
+#include <string.h>
+#include <tts.h>
+
+#include <reading_composer.h>
+#include <logger.h>
+#include <utils.h>
+
+#define STATE_SET_CONTAINS(states, state)\
+       ((states & ((gint64)1 << state)) ? (EINA_TRUE) : (EINA_FALSE))
+
+extern bool read_description;
+
+static void display_info_about_object(AtspiAccessibleReadingMaterial *rm)
+{
+       DEBUG("START");
+       DEBUG("------------------------");
+       DEBUG("NAME:%s", rm->name);
+       DEBUG("TEXT IFACE NAME:%s", rm->text_interface_name);
+       DEBUG("DESCRIPTION:%s", rm->description);
+       DEBUG("ROLE:%s", rm->localized_role_name);
+       DEBUG("CHILDS:%d", rm->child_count);
+       DEBUG("INDEX IN PARENT:%d", rm->index_in_parent);
+       DEBUG("VALUE:%f", rm->value);
+       DEBUG("VALUE MAX:%f", rm->upper);
+       DEBUG("VALUE MIN:%f", rm->lower);
+       DEBUG("STATES:");
+       DEBUG("------------------------");
+       DEBUG("END");
+}
+
+static void add_slider_description(Eina_Strbuf *buf, AtspiAccessibleReadingMaterial *rm)
+{
+       char trait[HOVERSEL_TRAIT_SIZE] = "";
+
+       int accuracy = get_accuracy(rm->increment, 3);
+
+       double add_for_rounding = 0.5f;
+       int mul_for_rounding = 1;
+       int count = 0;
+       for (count = 0; count < accuracy; count++) {
+               add_for_rounding *= 0.1f;
+               mul_for_rounding *= 10;
+       }
+
+       int val = (int)((rm->value + add_for_rounding) * mul_for_rounding);
+       int max_val = (int)((rm->upper + add_for_rounding) * mul_for_rounding);
+       int min_val = (int)((rm->lower + add_for_rounding) * mul_for_rounding);
+
+       int percent = ((val - min_val) / (double)(abs(max_val - min_val))) * 100;
+       char buf_percent[64] = "\0";
+
+       g_snprintf(buf_percent, sizeof(buf_percent), "%d", percent);
+       SUPPRESS_FORMAT_ERROR(g_snprintf(trait, sizeof(trait), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf_percent));
+
+       if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED))
+               g_snprintf(trait + strlen(trait), sizeof(trait) - strlen(trait), " , %s", _IGNORE_ON_TV("IDS_TPLATFORM_BODY_FLICK_UP_AND_DOWN_TO_ADJUST_THE_POSITION_T_TTS"));
+       ESAL(buf, trait);
+}
+
+static char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
+{
+       AtspiRole role = rm->role;
+       char ret[TTS_MAX_TEXT_SIZE] = { [TTS_MAX_TEXT_SIZE - 1] = 0 };
+       switch (role) {
+       case ATSPI_ROLE_ENTRY:
+       case ATSPI_ROLE_PASSWORD_TEXT: {
+               AtspiAccessible *parent = rm->parent;
+               if (parent) {
+                       AtspiRole parent_role = rm->parent_role;
+                       if (parent_role == ATSPI_ROLE_SPIN_BUTTON && STATE_SET_CONTAINS(rm->states, ATSPI_STATE_FOCUSED))
+                               break;
+               }
+               g_snprintf(ret, sizeof(ret), "%s", _("IDS_TPLATFORM_BODY_EDIT_FIELD_M_NOUN_T_TTS"));
+               break;
+       }
+       case ATSPI_ROLE_COMBO_BOX: {
+               int children_count = rm->child_count;
+               char buf[TTS_MAX_TEXT_SIZE] = "";
+               g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
+               SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
+               g_strlcat(ret, " ", sizeof(ret) - strlen(ret) - 1);
+               g_strlcat(ret, buf, sizeof(ret) - strlen(ret) - 1);
+               break;
+       }
+       case ATSPI_ROLE_GLASS_PANE: {
+               AtspiAccessible *parent = rm->parent;
+               if (parent) {
+                       int children_count = rm->parent_child_count;
+                       char buf[TTS_MAX_TEXT_SIZE] = "";
+                       g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
+                       SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
+                       g_strlcat(ret, " ", sizeof(ret) - strlen(ret) - 1);
+                       g_strlcat(ret, buf, sizeof(ret) - strlen(ret) - 1);
+               }
+               break;
+       }
+       case ATSPI_ROLE_LIST_ITEM: {
+               AtspiAccessible *parent = rm->parent;
+               if (parent) {
+                       if (STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_ANIMATED)) {
+                               g_strlcpy(ret, _("IDS_GALLERY_OPT_REORDER"), sizeof(ret) - 1);
+                               g_strlcat(ret, " , ", sizeof(ret) - strlen(ret) - 1);
+                               g_strlcat(ret, _("IDS_ACCS_BODY_BUTTON_TTS"), sizeof(ret) - strlen(ret) - 1);
+                       }
+               }
+               break;
+       }
+       case ATSPI_ROLE_PUSH_BUTTON: {
+               g_strlcpy(ret, _("IDS_ACCS_BODY_BUTTON_TTS"), sizeof(ret) - 1);
+               break;
+       }
+       case ATSPI_ROLE_PROGRESS_BAR: {
+               double val = rm->value;
+               if (val > 0) {
+                       char buf[255];
+                       g_snprintf(buf, sizeof(buf), "%.0f", val * 100);
+                       SUPPRESS_FORMAT_ERROR(g_snprintf(ret, sizeof(ret), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf));
+               }
+               break;
+       }
+       case ATSPI_ROLE_SLIDER: {
+               gchar *role_name = rm->localized_role_name;
+               if (role_name)
+                       g_strlcat(ret, role_name, sizeof(ret) - strlen(ret) - 1);
+               break;
+       }
+       case ATSPI_ROLE_SCROLL_BAR: {
+               GHashTable *hash_table = rm->attributes;
+               if (hash_table) {
+                       const char *style = g_hash_table_lookup(hash_table, "style");
+                       if (!g_strcmp0(style, "default"))
+                               g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_TBOPT_ALPHABETICAL_INDEX_BAR"));
+               }
+               break;
+       }
+       case ATSPI_ROLE_INVALID:
+       case ATSPI_ROLE_TOGGLE_BUTTON:
+       case ATSPI_ROLE_HEADING:
+       case ATSPI_ROLE_PAGE_TAB:
+       case ATSPI_ROLE_EDITBAR:
+       case ATSPI_ROLE_CHECK_BOX:
+       case ATSPI_ROLE_MENU_ITEM:
+       case ATSPI_ROLE_RADIO_MENU_ITEM:
+       case ATSPI_ROLE_RADIO_BUTTON:
+       case ATSPI_ROLE_POPUP_MENU:
+       case ATSPI_ROLE_DIALOG:
+       case ATSPI_ROLE_UNKNOWN:
+       case ATSPI_ROLE_GROUPING: {
+               break;
+       }
+       default: {
+               gchar *role_name = rm->localized_role_name;
+               if (role_name)
+                       g_strlcpy(ret, role_name, sizeof(ret) - 1);
+       }
+       }
+
+       return g_strdup(ret);
+}
+
+static char *generate_state_trait(AtspiAccessibleReadingMaterial *rm)
+{
+       AtspiRole role = rm->role;
+       char ret[TTS_MAX_TEXT_SIZE] = "\0";
+       switch (role) {
+       case ATSPI_ROLE_LIST_ITEM: {
+               AtspiAccessible *parent = rm->parent;
+               if (!parent) break;
+               AtspiRole parent_role = rm->parent_role;
+               if (parent_role == ATSPI_ROLE_TREE_TABLE) {
+                       gboolean is_selected = STATE_SET_CONTAINS(rm->states, ATSPI_STATE_SELECTED);
+                       if (is_selected)
+                               g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
+               }
+               break;
+       }
+       case ATSPI_ROLE_CHECK_BOX:
+       case ATSPI_ROLE_RADIO_BUTTON: {
+               AtspiAccessible *parent;
+               AtspiRole parent_role;
+               parent = rm->parent;
+               if (!parent) break;
+               parent_role = rm->parent_role;
+               if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED))
+                       g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
+               else if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE) && (parent_role != ATSPI_ROLE_COLOR_CHOOSER))
+                       g_strlcpy(ret, _("IDS_ACCS_OPT_NOT_SELECTED_TTS"), sizeof(ret) - 1);
+               //Role name should not be read for radio button, color selector, multibuttonentry items
+               break;
+       }
+       case ATSPI_ROLE_TOGGLE_BUTTON: {
+               if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED))
+                       g_strlcpy(ret, _("IDS_MSG_BODY_ON_T_TTS"), sizeof(ret) - 1);
+               else
+                       g_strlcpy(ret, _("IDS_STORYALBUM_BODY_OFF_T_TTS"), sizeof(ret) - 1);
+               break;
+       }
+       case ATSPI_ROLE_RADIO_MENU_ITEM: {
+               g_strlcpy(ret, _("IDS_ACCS_BODY_SELECTED_TTS"), sizeof(ret) - 1);
+               break;
+       }
+       default:
+               break;
+       }
+
+       return g_strdup(ret);
+}
+
+static char *generate_description_trait(AtspiAccessibleReadingMaterial *rm)
+{
+       DEBUG("START");
+       AtspiRole role = rm->role;
+       char *ret = NULL;
+       Eina_Strbuf *buf;
+
+       buf = eina_strbuf_new();
+       switch (role) {
+       case ATSPI_ROLE_ENTRY:
+       case ATSPI_ROLE_PASSWORD_TEXT: {
+               if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE)) break;
+               if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_FOCUSED))
+                       ESAL(buf, _("IDS_ST_BODY_EDITING_T_TTS"));
+               else
+                       ESAL(buf, _IGNORE_ON_TV("IDS_ST_BODY_DOUBLE_TAP_TO_ENTER_TEXT_T_TTS"));
+               break;
+       }
+       case ATSPI_ROLE_MENU_ITEM: {
+               AtspiAccessible *parent = rm->parent;
+               if (!parent) break;
+               AtspiRole parent_role = rm->parent_role;
+               if (parent_role == ATSPI_ROLE_TOOL_BAR) {
+                       int children_count = rm->parent_child_count;
+                       int index = rm->index_in_parent;
+                       AtspiSelection *selection = atspi_accessible_get_selection_iface(parent);
+                       gboolean is_selected = rm->is_selected_in_parent;
+                       SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_ACCS_BODY_TAB_P1SD_OF_P2SD"), index + 1, children_count));
+                       if (!is_selected) {
+                               ESAL(buf, " , ");
+                               ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_SELECT_TTS"));
+                       }
+                       g_object_unref(selection);
+               }
+               break;
+       }
+       case ATSPI_ROLE_LIST_ITEM: {
+               AtspiAccessible *parent = rm->parent;
+               if (!parent) break;
+               AtspiRole parent_role = rm->parent_role;
+               if (parent_role == ATSPI_ROLE_TREE_TABLE) {
+                       ESAL(buf, _("IDS_BR_BODY_IMAGE_T_TTS"));
+
+                       bool is_parent_multiselectable = STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_MULTISELECTABLE);
+
+                       if (is_parent_multiselectable) {
+                               int selected_children_count = rm->parent_selected_child_count;
+                               SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_SCR_BODY_PD_SELECTED_IN_TOTAL_TTS"), selected_children_count));
+                       }
+               } else if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDABLE)
+                                  && (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDED) || STATE_SET_CONTAINS(rm->states, ATSPI_STATE_COLLAPSED))) {
+                       //ELM_GENLIST_ITEM_GROUP
+                       ESAL(buf, _("IDS_AM_OPT_HEADER_TTS"));
+                       //Genlist group & tree item have checkbox
+                       int children_count = rm->child_count;
+                       if (children_count > 0) {
+                               if (rm->has_checkbox_child) {
+                                       ESAL(buf, " , ");
+                                       ESAL(buf, _("IDS_SCR_TBOPT_TICKBOX_FOR_ENTIRE_GROUP"));
+                               }
+                       }
+               } else if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDABLE)) {
+                       //ELM_GENLIST_ITEM_TREE
+                       ESAL(buf, _("IDS_AM_OPT_HEADER_TTS"));
+                       ESAL(buf, " , ");
+                       ESAL(buf, _("IDS_TPLATFORM_BODY_EXPANDABLE_LIST"));
+                       if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EXPANDED)) {
+                               ESAL(buf, " , ");
+                               ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_COLLAPSE_THE_LIST_T_TTS"));
+                       } else {
+                               ESAL(buf, " , ");
+                               ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_EXPAND_THE_LIST_T_TTS"));
+                       }
+                       //ELM_GENLIST_ITEM_GROUP
+                       //Genlist group & tree item have checkbox
+                       int children_count = rm->child_count;
+                       if (children_count > 0) {
+                               if (rm->has_checkbox_child) {
+                                       ESAL(buf, " , ");
+                                       ESAL(buf, _("IDS_SCR_TBOPT_TICKBOX_FOR_ENTIRE_GROUP"));
+                               }
+                       }
+               } else if (STATE_SET_CONTAINS(rm->parent_states, ATSPI_STATE_ANIMATED)) {
+                       ESAL(buf, _IGNORE_ON_TV("IDS_BR_BODY_DOUBLE_TAP_AND_HOLD_THEN_DRAG_TO_REORDER_TTS"));
+               }
+               break;
+       }
+       case ATSPI_ROLE_POPUP_MENU: {
+               int children_count;
+               AtspiAccessible *parent = rm->parent;
+               if (!parent) break;
+               AtspiRole parent_role = rm->parent_role;
+               if (parent_role == ATSPI_ROLE_COMBO_BOX) break;
+               children_count = rm->child_count;
+               SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
+               break;
+       }
+       case ATSPI_ROLE_DIALOG: {
+               int children_count = rm->list_children_count;
+               if (children_count > 0)
+                       SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
+               break;
+       }
+       case ATSPI_ROLE_COMBO_BOX:
+       case ATSPI_ROLE_GLASS_PANE: {
+               ESAL(buf, _IGNORE_ON_TV("IDS_ST_BODY_DOUBLE_TAP_TO_OPEN_THE_MENU_T_TTS"));
+               break;
+       }
+       case ATSPI_ROLE_CHECK_BOX:
+       case ATSPI_ROLE_RADIO_BUTTON: {
+               AtspiAccessible *parent;
+               parent = rm->parent;
+               if (!parent) break;
+               if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_CHECKED) && STATE_SET_CONTAINS(rm->states, ATSPI_STATE_EDITABLE))
+                       ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_BODY_DOUBLE_TAP_TO_EDIT_T_TTS"));
+               //Role name should not be read for radio button, color selector, multibuttonentry items
+               break;
+       }
+       case ATSPI_ROLE_PROGRESS_BAR: {
+               ESAL(buf, _("IDS_ACCS_TBBODY_IN_PROGRESS"));
+               break;
+       }
+       case ATSPI_ROLE_SLIDER: {
+               add_slider_description(buf, rm);
+               break;
+       }
+       case ATSPI_ROLE_SCROLL_BAR: {
+               GHashTable *hash_table = rm->attributes;
+               if (hash_table) {
+                       const char *style = g_hash_table_lookup(hash_table, "style");
+                       if (!g_strcmp0(style, "pagecontrol")) {
+                               int child_count = rm->child_count;
+                               int idx = rm->first_selected_child_index;
+                               SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_ACCS_POP_PAGE_P1SD_OF_P2SD_M_DESCRIPTIVE_FORM_TTS"), idx + 1, child_count));
+                       } else {
+                               ESAL(buf, _IGNORE_ON_TV("IDS_ACCS_TBBODY_SWIPE_RIGHT_OR_LEFT_WITH_ONE_FINGER_TO_SELECT_NEXT_OR_PREVIOUS_LETTER"));
+                       }
+               }
+               break;
+       }
+       default:
+               break;
+       }
+
+       ret = eina_strbuf_string_steal(buf);
+       eina_strbuf_free(buf);
+       DEBUG("END");
+       return ret;
+}
+
+static char *generate_description_from_relation_object(AtspiAccessibleReadingMaterial *rm)
+{
+       char *trait = NULL;
+       Eina_Strbuf *buf;
+       char *role_name = generate_role_trait(rm);
+       char *description_from_role = NULL;
+       char *state_from_role = generate_state_trait(rm);
+
+       buf = eina_strbuf_new();
+       if (role_name && strlen(role_name) > 0)
+               ESAL(buf, role_name);
+
+       if (read_description)
+               description_from_role = generate_description_trait(rm);
+       if (description_from_role && strlen(description_from_role) > 0) {
+               if (eina_strbuf_length_get(buf))
+                       ESAL(buf, " , ");
+               ESAL(buf, description_from_role);
+       }
+
+       if (state_from_role && strlen(state_from_role) > 0) {
+               if (eina_strbuf_length_get(buf))
+                       ESAL(buf, " , ");
+               ESAL(buf, state_from_role);
+       }
+       SCREEN_READER_SAFE_FREE(role_name, free);
+       SCREEN_READER_SAFE_FREE(description_from_role, free);
+       SCREEN_READER_SAFE_FREE(state_from_role, free);
+
+       if (rm->description && strlen(rm->description) > 0)
+               eina_strbuf_prepend_printf(buf, "%s , ", rm->description);
+
+       trait = eina_strbuf_string_steal(buf);
+       eina_strbuf_free(buf);
+       return trait;
+}
+
+unsigned short int reading_composer_reading_attribute_get(AtspiAccessibleReadingMaterial *rm)
+{
+       unsigned short int attribute = 0;
+       gchar *reading_info = NULL;
+       GHashTable *hash_table = rm->attributes;
+       if (hash_table) {
+               reading_info = g_hash_table_lookup(hash_table, "reading_info_type");
+               if (reading_info) {
+                       unsigned int n = 0;
+                       char **list = eina_str_split_full(reading_info, "|", 100, &n);
+                       if (list) {
+                               int i;
+                               for (i = 0; i < n; i++) {
+                                       if (!g_strcmp0(list[i], "name"))
+                                               attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_NAME);
+                                       else if (!g_strcmp0(list[i], "role"))
+                                               attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_ROLE);
+                                       else if (!g_strcmp0(list[i], "description"))
+                                               attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+                                       else if (!g_strcmp0(list[i], "state"))
+                                               attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_STATE);
+                               }
+                               g_free(list[0]);
+                               g_free(list);
+                       }
+               }
+       }
+       if (!hash_table || !reading_info) {
+               attribute = attribute | (ACCESSIBLE_READING_INFO_TYPE_NAME) |
+                                       (ACCESSIBLE_READING_INFO_TYPE_ROLE) | (ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION) | (ACCESSIBLE_READING_INFO_TYPE_STATE);
+       }
+
+       return attribute;
+}
+
+void reading_composer_reading_material_free(AtspiAccessibleReadingMaterial *rm)
+{
+       if (rm->parent)
+               g_object_unref(rm->parent);
+
+       if (rm->described_by_accessible)
+               g_object_unref(rm->described_by_accessible);
+
+       g_hash_table_unref(rm->attributes);
+       g_free(rm->name);
+       g_free(rm->labeled_by_name);
+       g_free(rm->text_interface_name);
+       g_free(rm->localized_role_name);
+       g_free(rm->description);
+       g_free(rm);
+}
+
+char* reading_composer_name_get(AtspiAccessible *obj)
+{
+       DEBUG("START");
+       AtspiAccessibleReadingMaterial *rm;
+       Eina_Strbuf *buf;
+       char *name = NULL;
+       char *name_from_relation = NULL;
+       char *text = NULL;
+       char *ret = NULL;
+
+       if (!obj)
+               return NULL;
+       rm = atspi_accessible_get_reading_material(obj, NULL);
+       if (!rm)
+               return NULL;
+       unsigned short reading_attribute = reading_composer_reading_attribute_get(rm);
+
+       buf = eina_strbuf_new();
+       if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_NAME) {
+               DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_NAME");
+               name = rm->name;
+               name_from_relation = rm->labeled_by_name;
+               text = rm->text_interface_name;
+
+               if (text && strlen(text))
+                       ESAL(buf, text);
+               if (name && strlen(name) > 0) {
+                       if (eina_strbuf_length_get(buf))
+                               eina_strbuf_append_char(buf, ',');
+                       ESAL(buf, name);
+               }
+               if (name_from_relation && strlen(name_from_relation) > 0) {
+                       if (eina_strbuf_length_get(buf))
+                               eina_strbuf_append_char(buf, ',');
+                       ESAL(buf, name_from_relation);
+               }
+               DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_NAME");
+       }
+
+       ret = eina_strbuf_string_steal(buf);
+       eina_strbuf_free(buf);
+       reading_composer_reading_material_free(rm);
+       DEBUG("RESULT: %s", ret);
+       DEBUG("END");
+       return ret;
+}
+
+char* reading_composer_description_get(AtspiAccessible *obj)
+{
+       char *result;
+       reading_composer_extended_description_get(obj, &result, NULL);
+       return result;
+}
+
+void reading_composer_extended_description_get(
+               AtspiAccessible *obj,
+               char **base_desc,
+               char **ext_desc)
+{
+       if(base_desc)
+               *base_desc = NULL;
+       if(ext_desc)
+               *ext_desc = NULL;
+
+       DEBUG("START");
+       char *name = NULL;
+       char *description = NULL;
+       char *role_name = NULL;
+       Eina_Strbuf *buf = NULL, *buf2 = NULL;
+       char *description_from_relation = NULL;
+       char *name_from_relation = NULL;
+       char *name_from_text_iface = NULL;
+       char *description_from_role = NULL;
+       char *state_from_role = NULL;
+       AtspiAccessibleReadingMaterial *rm;
+
+       if (!obj) return;
+
+       rm = atspi_accessible_get_reading_material(obj, NULL);
+       if (!rm)  return;
+
+       display_info_about_object(rm);
+
+       unsigned short reading_attribute = reading_composer_reading_attribute_get(rm);
+
+       buf = eina_strbuf_new();
+       buf2 = ext_desc ? eina_strbuf_new() : buf2;
+       if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_NAME) {
+               DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_NAME");
+               name = rm->name;
+               name_from_relation = rm->labeled_by_name;
+               name_from_text_iface = rm->text_interface_name;
+
+               if (name && strlen(name) > 0)
+                       ESAL(buf, name);
+               if (name_from_relation && strlen(name_from_relation) > 0) {
+                       if (eina_strbuf_length_get(buf))
+                               ESAL(buf, " , ");
+                       ESAL(buf, name_from_relation);
+               }
+               /* For text object on WEB page which does not have accessible name */
+               /* And for password entry which does not have accessible name */
+               if (eina_strbuf_length_get(buf) == 0 && name_from_text_iface) {
+                       unsigned int text_len = strlen(name_from_text_iface);
+                       if (text_len > 0) {
+                               DEBUG("Object has text interface value only");
+                               if (rm->role == ATSPI_ROLE_PASSWORD_TEXT) {
+                                       SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf,
+                                                                                 ngettext("PLURAL_ZERO_ACCS_TBOPT_PD_CHARACTERS",
+                                                                                                  "PLURAL_ZERO_ACCS_TBOPT_PD_CHARACTERS", text_len),
+                                                                                 text_len));
+                               } else {
+                                       ESAL(buf, name_from_text_iface);
+                               }
+                       }
+               }
+               DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_NAME");
+       }
+       if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_ROLE) {
+               DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_ROLE");
+               role_name = generate_role_trait(rm);
+               if (role_name && strlen(role_name) > 0) {
+                       if (eina_strbuf_length_get(buf))
+                               ESAL(buf, " , ");
+                       ESAL(buf, role_name);
+               }
+               SCREEN_READER_SAFE_FREE(role_name, free);
+               DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_ROLE");
+       }
+       /* read_description: if description reading is enabled */
+       if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION) {
+               /* read_description is determined by vconf value for the 'read usage hints aloud' */
+               DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION (read usage hints: %d)", read_description);
+               description = rm->description;
+               /* If description is set by application side, do not read other default information */
+               if (read_description && description && strlen(description) > 0) {
+                       if (eina_strbuf_length_get(buf2))
+                               ESAL(buf2, " , ");
+                       ESAL(buf2, description);
+               } else if (STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED)) {
+                       if (read_description)
+                               description_from_role = generate_description_trait(rm);
+
+                       if (rm->described_by_accessible) {
+                               AtspiAccessibleReadingMaterial *_rm = atspi_accessible_get_reading_material(rm->described_by_accessible, NULL);
+                               if (_rm) {
+                                       description_from_relation = generate_description_from_relation_object(_rm);
+                                       reading_composer_reading_material_free(_rm);
+                               }
+                       }
+
+                       if (description_from_role && strlen(description_from_role) > 0) {
+                               if (eina_strbuf_length_get(buf2))
+                                       ESAL(buf2, " , ");
+                               ESAL(buf2, description_from_role);
+                       }
+                       if (description_from_relation && strlen(description_from_relation)) {
+                               if (eina_strbuf_length_get(buf2))
+                                       ESAL(buf2, " , ");
+                               ESAL(buf2, description_from_relation);
+                       }
+               }
+               SCREEN_READER_SAFE_FREE(description_from_relation, free);
+               SCREEN_READER_SAFE_FREE(description_from_role, free);
+               DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION");
+       }
+       if (reading_attribute & ACCESSIBLE_READING_INFO_TYPE_STATE) {
+               DEBUG("START : ACCESSIBLE_READING_INFO_TYPE_STATE");
+               state_from_role = generate_state_trait(rm);
+               if (state_from_role && strlen(state_from_role) > 0) {
+                       if (eina_strbuf_length_get(buf))
+                               ESAL(buf, " , ");
+                       ESAL(buf, state_from_role);
+               }
+               if (!STATE_SET_CONTAINS(rm->states, ATSPI_STATE_ENABLED)) {
+                       if (eina_strbuf_length_get(buf))
+                               ESAL(buf, " , ");
+                       ESAL(buf, _("IDS_ACCS_BODY_DISABLED_TTS"));
+               }
+               SCREEN_READER_SAFE_FREE(state_from_role, free);
+               DEBUG("END : ACCESSIBLE_READING_INFO_TYPE_STATE");
+       }
+
+       DEBUG("RESULT: %s", eina_strbuf_string_get(buf));
+       DEBUG("RESULT description: %s", eina_strbuf_string_get(buf2));
+       if(base_desc)
+               *base_desc = eina_strbuf_string_steal(buf);
+       if (ext_desc)
+               *ext_desc = eina_strbuf_string_steal(buf2);
+
+       eina_strbuf_free(buf);
+       if (buf != buf2)
+               eina_strbuf_free(buf2);
+       reading_composer_reading_material_free(rm);
+       DEBUG("END");
+}
+
index 62f719ad024f076488bd43ec7b499a659d9712ee..f8b2ae3f3c4f1554367fe76727a1be6dd69c8f00 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <logger.h>
 #include <navigator.h>
+#include <reading_composer.h>
 #include <screen_reader_spi.h>
 #include <screen_reader_tts.h>
 
@@ -233,8 +234,6 @@ static char *spi_on_text_delete(SpiData *spi, AtspiEvent *event)
        return g_strdup(ret);
 }
 
-void generate_what_to_read_impl(char **ret, char **description_ret, AtspiAccessible *obj);
-
 void spi_event_get_text_to_read(
                SpiData *spi,
                char **text_to_read,
@@ -250,7 +249,7 @@ void spi_event_get_text_to_read(
        if (!g_strcmp0(event->type, spi->tracking_signal_name)) {
                /* tracking singal "focused" */
                if (event->detail1 == 1) {
-                       generate_what_to_read_impl(text_to_read, descr_to_read, event->source);
+                       reading_composer_extended_description_get(event->source, text_to_read, descr_to_read);
                }
 
        } else if (!g_strcmp0(event->type, CARET_MOVED_SIG)) {
index c50c35d4d0f1573f00421cea6152f6a2a2816f30..213488f1d710616af1c2888c1e09e2425b3e5e05 100644 (file)
  * limitations under the License.
  */
 
-#include "logger.h"
-#include "utils.h"
-#include <glib.h>
 #include <atspi/atspi.h>
+#include <glib.h>
+#include <string.h>
+
+#include <logger.h>
+#include <utils.h>
 
 static Eldbus_Connection *a11y_bus_conn = NULL; /* a11y_bus */
 void utils_a11y_bus_connection_set(Eldbus_Connection *conn)
@@ -230,3 +232,20 @@ Eina_Bool object_has_highlighted_state(AtspiAccessible *obj)
        g_object_unref(ss);
        return ret;
 }
+
+int get_accuracy(double val, int max_accuracy)
+{
+       char val_str[HOVERSEL_TRAIT_SIZE] = "";
+       int position;
+       int accuracy;
+
+       g_snprintf(val_str, HOVERSEL_TRAIT_SIZE, "%.*f", max_accuracy, val);
+       accuracy = max_accuracy;
+       position = strlen(val_str) - 1;
+       while (position > 0 && val_str[position] == '0') {
+               --position;
+               --accuracy;
+       }
+       return accuracy;
+}
+