Customization of value reading 63/291563/1 accepted/tizen/6.0/unified/20230427.080401
authorLukasz Oleksak <l.oleksak@samsung.com>
Wed, 12 Apr 2023 15:08:40 +0000 (17:08 +0200)
committerArtur Świgoń <a.swigon@samsung.com>
Tue, 18 Apr 2023 09:41:12 +0000 (11:41 +0200)
Change-Id: Ic89b14e514c4aea088da1a2e22698d0a2489087f

include/reading_composer.h
include/utils.h
src/app_tracker.c
src/reading_composer.c
src/screen_reader_spi.c
src/utils.c

index d69a453796898a04b2ffbdc971f80ac1fd06728d..518ed613e4e0c398767ec1dac5206f48f8f639a6 100644 (file)
@@ -39,8 +39,9 @@ char* reading_composer_extended_description_get(ReadingComposerData *data);
 
 /**
  * @brief This function provides textual representation of the value carried by UI element
- *        which is expressed in percents.
+ *        formatted accordingly to the "value_format" ATSPI attribute. Supported formats are:
+ *        "percent" (default), "number" and "text".
  */
-char* reading_composer_percent_value_description_get(ReadingComposerData *data);
+char* reading_composer_value_text_get(ReadingComposerData *data);
 
 #endif
index d55e450544065b2571af90f3d22e5bf261a9c556..1231c9a186d0d6b9bb14536db51b2780a1207cac 100644 (file)
@@ -14,6 +14,9 @@
 #define ESAL(buf, txt)\
        eina_strbuf_append_length(buf, txt, strlen(txt))
 
+#define ESAF(buf, ...)\
+       SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, __VA_ARGS__))
+
 #define SCREEN_READER_SAFE_FREE(_h, _fn) do { _fn((void*)_h); _h = NULL; } while (0)
 
 #define MAX_ACCURACY 3
@@ -107,6 +110,13 @@ void cycle_detection_initialize(cycle_detection_data *data, const void *key);
  */
 Eina_Bool cycle_detection_check_if_in_cycle(cycle_detection_data *data, const void *key);
 
+typedef enum {
+       ACCESSIBLE_VALUE_FORMAT_PERCENT = 1 << 0,
+       ACCESSIBLE_VALUE_FORMAT_NUMBER = 1 << 1,
+       ACCESSIBLE_VALUE_FORMAT_TEXT = 1 << 2
+} Value_Format;
+Value_Format get_value_format(GHashTable *hash_table);
+
 enum Reading_Info {
        ACCESSIBLE_READING_INFO_TYPE_NAME = 1 << 0,
        ACCESSIBLE_READING_INFO_TYPE_ROLE = 1 << 1,
index 2eeffb53535de9c9c9bc296d412ffd9e3c52eab5..ce4a00259f2fab7e98c20a1b490942c2b740dc77 100644 (file)
@@ -146,7 +146,7 @@ static void _read_value(AtspiAccessible *obj)
 
        char* text_to_speak = NULL;
        ReadingComposerData *rcd = reading_composer_data_get(obj);
-       text_to_speak = reading_composer_percent_value_description_get(rcd);
+       text_to_speak = reading_composer_value_text_get(rcd);
        reading_composer_data_free(rcd);
        tw_speak(text_to_speak, EINA_TRUE);
        free(text_to_speak);
index 8cc1298e9ae61de7d8fc7a2bc4b96c3f4836c6fc..646981f6193d2de54320e8e4cdd3bc244ed12b58 100644 (file)
@@ -23,6 +23,7 @@ TIZEN_PROD_STATIC void display_info_about_object(AtspiAccessibleReadingMaterial
        DEBUG("VALUE:%f", rm->value);
        DEBUG("VALUE MAX:%f", rm->upper);
        DEBUG("VALUE MIN:%f", rm->lower);
+       DEBUG("VALUE TEXT:%s", rm->value_text);
        DEBUG("STATES:");
        DEBUG("------------------------");
        DEBUG("END");
@@ -41,9 +42,20 @@ TIZEN_PROD_STATIC void add_percent_value_string(Eina_Strbuf *buf, int percent)
        SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf_percent));
 }
 
-TIZEN_PROD_STATIC void add_slider_state(Eina_Strbuf *buf, AtspiAccessibleReadingMaterial *rm)
+TIZEN_PROD_STATIC void add_value_text(Eina_Strbuf *buf, AtspiAccessibleReadingMaterial *rm)
 {
-       add_percent_value_string(buf, get_percent_value_from_rm(rm));
+       Value_Format value_format = get_value_format(rm->attributes);
+       switch (value_format) {
+               default:
+               case ACCESSIBLE_VALUE_FORMAT_PERCENT:
+                       add_percent_value_string(buf, get_percent_value_from_rm(rm));
+                       break;
+               case ACCESSIBLE_VALUE_FORMAT_NUMBER:
+                       ESAF(buf, "%g", rm->value);
+                       break;
+               case ACCESSIBLE_VALUE_FORMAT_TEXT:
+                       ESAL(buf, rm->value_text);
+       }
 }
 
 TIZEN_PROD_STATIC
@@ -61,6 +73,7 @@ void reading_composer_reading_material_free(AtspiAccessibleReadingMaterial *rm)
        g_free(rm->text_interface_name);
        g_free(rm->localized_role_name);
        g_free(rm->description);
+       g_free(rm->value_text);
        g_free(rm);
 }
 
@@ -271,7 +284,7 @@ TIZEN_PROD_STATIC char *generate_state_trait_from_role(AtspiAccessibleReadingMat
                break;
        }
        case ATSPI_ROLE_SLIDER: {
-               add_slider_state(buf, rm);
+               add_value_text(buf, rm);
                break;
        }
        default:
@@ -735,26 +748,17 @@ char* reading_composer_extended_description_get(ReadingComposerData *data) {
        return reading_composer_extended_description_get_recursive(data, 0, 1);
 }
 
-char* reading_composer_percent_value_description_get(ReadingComposerData *data) {
-       Eina_Strbuf *buf = NULL;
-       AtspiAccessibleReadingMaterial *rm;
+char* reading_composer_value_text_get(ReadingComposerData *data)
+{
+       AtspiAccessibleReadingMaterial *rm = data;
 
        if (!data)
                return NULL;
 
-       rm = data;
-
-       buf = eina_strbuf_new();
-       if (!buf) {
-               ERROR("CRITICAL: Memory allocation failed!");
-               return NULL;
-       }
-
-       add_percent_value_string(buf, get_percent_value_from_rm(rm));
+       Eina_Strbuf *buf = eina_strbuf_new();
+       add_value_text(buf, rm);
 
-       char *percent_value_description = eina_strbuf_string_steal(buf);
-       eina_strbuf_free(buf);
-       return percent_value_description;
+       return eina_strbuf_release(buf);
 }
 
 ReadingComposerData* reading_composer_data_get(AtspiAccessible *obj)
index f0bec03cf743c3219724edc35d77b2b3a10f700c..3f90909fd8dd9bddba5c034570a739419d9c8f84 100644 (file)
@@ -175,42 +175,10 @@ static char *spi_on_caret_move_get_text(SpiData *spi, AtspiEvent *event)
 static char *spi_on_value_changed_get_text(SpiData *spi, AtspiEvent *event)
 {
        char *text_to_read = NULL;
-
        spi->currently_focused = event->source;
-
-       AtspiValue *value_interface = atspi_accessible_get_value_iface(spi->currently_focused);
-
-       if (value_interface) {
-               char *name = atspi_accessible_get_name(spi->currently_focused, NULL);
-               DEBUG("VALUE CHANGED WIDGET: %s", name);
-               g_free(name);
-
-               double current_temp_value = (double)atspi_value_get_current_value(value_interface, NULL);
-               //FIXME : This IDS value is not supported.
-               /*if (abs(current_temp_value - atspi_value_get_maximum_value(value_interface, NULL)) < EPS) {
-                       DEBUG("MAX VALUE REACHED");
-                       if (asprintf(&text_to_read, "%.2f %s", current_temp_value, _("IDS_REACHED_MAX_VAL")) < 0) {
-                               ERROR(MEMORY_ERROR);
-                               g_object_unref(value_interface);
-                               return NULL;
-                       }
-               } else if (abs(current_temp_value - atspi_value_get_minimum_value(value_interface, NULL)) < EPS) {
-                       DEBUG("MIN VALUE REACHED");
-                       if (asprintf(&text_to_read, "%.2f %s", current_temp_value, _("IDS_REACHED_MIN_VAL")) < 0) {
-                               ERROR(MEMORY_ERROR);
-                               g_object_unref(value_interface);
-                               return NULL;
-                       }
-               } else {*/
-               if (asprintf(&text_to_read, "%.2f", current_temp_value) < 0) {
-                       ERROR(MEMORY_ERROR);
-                       g_object_unref(value_interface);
-                       return NULL;
-               }
-               //}
-               g_object_unref(value_interface);
-       }
-
+       ReadingComposerData *rcd = reading_composer_data_get(spi->currently_focused);
+       text_to_read = reading_composer_value_text_get(rcd);
+       reading_composer_data_free(rcd);
        return text_to_read;
 }
 
@@ -505,4 +473,3 @@ void spi_shutdown(SpiData *spi)
 
        DEBUG("END");
 }
-
index b95bf18d203f727adec242385bbdcc62e5c640f4..ad2e3aaec02a66b7c7ad275db52910040cb426a5 100644 (file)
@@ -150,6 +150,23 @@ Eina_Bool cycle_detection_check_if_in_cycle(cycle_detection_data *data, const vo
        return EINA_FALSE;
 }
 
+Value_Format get_value_format(GHashTable *hash_table)
+{
+       Value_Format value_format = ACCESSIBLE_VALUE_FORMAT_PERCENT;
+       if (hash_table) {
+               const gchar *value_format_str = NULL;
+               value_format_str = g_hash_table_lookup(hash_table, "value_format");
+               if (value_format_str) {
+                       if (!g_strcmp0(value_format_str, "number")) {
+                               value_format = ACCESSIBLE_VALUE_FORMAT_NUMBER;
+                       } else if (!g_strcmp0(value_format_str, "text")) {
+                               value_format = ACCESSIBLE_VALUE_FORMAT_TEXT;
+                       }
+               }
+       }
+       return value_format;
+}
+
 unsigned short int get_object_reading_info_type_attributes(AtspiAccessible *obj)
 {
        unsigned short int attribute = 0;