Customization of value reading 84/291484/1 accepted/tizen/7.0/unified/20230424.135838 accepted/tizen/7.0/unified/20230428.015857
authorLukasz Oleksak <l.oleksak@samsung.com>
Wed, 12 Apr 2023 15:08:40 +0000 (17:08 +0200)
committerArtur Świgoń <a.swigon@samsung.com>
Mon, 17 Apr 2023 09:22:42 +0000 (11:22 +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 7820b2dcd5c80218691211353c64a79d328af8b2..cb4bb3e866ca211e72140e99f41cad7afe6dabfe 100644 (file)
@@ -113,6 +113,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 e68ef2f768f8dae9d004f3d548b04c1dccea1267..690df0588fd3af5ab7eb7430d0fbbcd41085e2f3 100644 (file)
@@ -145,7 +145,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_and_free(text_to_speak, EINA_TRUE);
 }
index 87f0f5db3c8f1f98de542b88d12c9eaf49e9ae3a..ff258ada192844c1d2a7455cb5e2cc99d2a2acd1 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)
        ESAF(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);
 }
 
@@ -269,7 +282,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:
@@ -703,7 +716,7 @@ 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)
+char* reading_composer_value_text_get(ReadingComposerData *data)
 {
        AtspiAccessibleReadingMaterial *rm = data;
 
@@ -711,8 +724,7 @@ char* reading_composer_percent_value_description_get(ReadingComposerData *data)
                return NULL;
 
        Eina_Strbuf *buf = eina_strbuf_new();
-
-       add_percent_value_string(buf, get_percent_value_from_rm(rm));
+       add_value_text(buf, rm);
 
        return eina_strbuf_release(buf);
 }
index 02df45e8b0aa17775677bc7b7eab96873a1104aa..48178f7ff86d5d610e052426d3f8634c113d27be 100644 (file)
@@ -175,7 +175,7 @@ static char *spi_on_value_changed_get_text(SpiData *spi, AtspiEvent *event)
        char *text_to_read = NULL;
        spi->currently_focused = event->source;
        ReadingComposerData *rcd = reading_composer_data_get(spi->currently_focused);
-       text_to_read = reading_composer_percent_value_description_get(rcd);
+       text_to_read = reading_composer_value_text_get(rcd);
        reading_composer_data_free(rcd);
        return text_to_read;
 }
index df4337788de9e5f48ceef6e41f9b20c2d4376a31..2dfddb3167987bd6f3cbb0359d4c0e0d669a507d 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;