Remove reading "in-progress" when progressbar reach maximum value 23/280323/4
authorLukasz Oleksak <l.oleksak@samsung.com>
Tue, 27 Apr 2021 12:21:52 +0000 (14:21 +0200)
committerMaria Bialota <m.bialota@samsung.com>
Fri, 26 Aug 2022 18:03:07 +0000 (20:03 +0200)
Change-Id: Idf3cb577e2425342e89fe91b47fbe16783a09efc

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

index 1446d4ac2e1911d5ef52ded8a90c7c72dba1851f..d69a453796898a04b2ffbdc971f80ac1fd06728d 100644 (file)
@@ -37,4 +37,10 @@ char* reading_composer_description_get(ReadingComposerData *data);
  */
 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.
+ */
+char* reading_composer_percent_value_description_get(ReadingComposerData *data);
+
 #endif
index b86d3646cdcdd16c8c52cfe19e6fb87de6018857..0eff4eef289ba69724e68818a62b9819c3e4b43f 100644 (file)
@@ -16,7 +16,7 @@
 
 #define SCREEN_READER_SAFE_FREE(_h, _fn) do { _fn((void*)_h); _h = NULL; } while (0)
 
-#define HOVERSEL_TRAIT_SIZE 200
+#define MAX_ACCURACY 3
 
 #ifndef TIZEN_GTEST
 #define TIZEN_PROD_STATIC static
@@ -121,7 +121,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);
+int get_percent_value(double value, double lower, double upper);
 
 #endif /* UTILS_H_ */
 
index 17fcf859c383d3a28c78a7977958d01b514c094f..95fefbf06192b6484135cb037c72408a5a8fa716 100644 (file)
@@ -141,32 +141,17 @@ end:
        return FALSE;
 }
 
-static void _read_value(AtspiValue *value)
+static void _read_value(AtspiAccessible *obj)
 {
-       if (!value)
+       if (!obj)
                return;
-       int accuracy = get_accuracy(atspi_value_get_minimum_increment(value, NULL), 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 current_val = (int)((atspi_value_get_current_value(value, NULL) + add_for_rounding) * mul_for_rounding);
-       int max_val = (int)((atspi_value_get_maximum_value(value, NULL) + add_for_rounding) * mul_for_rounding);
-       int min_val = (int)((atspi_value_get_minimum_value(value, NULL) + add_for_rounding) * mul_for_rounding);
-
-       int percent = ((current_val - min_val) / (double)(abs(max_val - min_val))) * 100;
 
-       char buf[256] = "\0";
-       char buf_percent[64] = "\0";
-       g_snprintf(buf_percent, sizeof(buf_percent), "%d", percent);
-       SUPPRESS_FORMAT_ERROR(g_snprintf(buf, sizeof(buf), _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf_percent));
-       DEBUG("has value %s", buf);
-       tw_speak(buf, EINA_TRUE);
+       char* text_to_speak = NULL;
+       ReadingComposerData *rcd = reading_composer_data_get(obj);
+       text_to_speak = reading_composer_percent_value_description_get(rcd);
+       reading_composer_data_free(rcd);
+       tw_speak(text_to_speak, EINA_TRUE);
+       free(text_to_speak);
 }
 
 static void timer_reschedule(App_Tracker_Data *atd)
@@ -433,9 +418,7 @@ static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
                goto end;
        } else if (!g_strcmp0(event->type, "object:property-change:accessible-value")) { // for reading slider and spinner value changes
                if (role == ATSPI_ROLE_SLIDER && (get_objects_attributes(event->source) & ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION)) {
-                       AtspiValue *value_interface = atspi_accessible_get_value_iface(event->source);
-                       _read_value(value_interface);
-                       g_object_unref(value_interface);
+                       _read_value(event->source);
                } else if (role == ATSPI_ROLE_FILLER) {
                        gchar *name = atspi_accessible_get_name(event->source, NULL);
                        if (!name) {
index ca92d52eba9af1ca428a5855be103b33a5d5bd0b..7589555f6a8ad7dfba5ef4bd53eaf2a68c8a1165 100644 (file)
@@ -28,45 +28,32 @@ TIZEN_PROD_STATIC void display_info_about_object(AtspiAccessibleReadingMaterial
        DEBUG("END");
 }
 
-TIZEN_PROD_STATIC void add_slider_description(Eina_Strbuf *buf, AtspiAccessibleReadingMaterial *rm)
+TIZEN_PROD_STATIC int get_percent_value_from_rm(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;
-       if (min_val >= max_val)
-               percent = 0;
-       else if (val <= min_val)
-               percent = 0;
-       else if (val >= max_val)
-               percent = 100;
-       else
-               percent = ((val - min_val) / (double)(abs(max_val - min_val))) * 100;
+       return get_percent_value(rm->value, rm->lower, rm->upper);
+}
 
+TIZEN_PROD_STATIC void add_percent_value_description(Eina_Strbuf *buf, int percent)
+{
        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));
-       ESAL(buf, trait);
+       SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_GCTS_OPT_P1SS_PERCENT_TTS"), buf_percent));
+}
+
+TIZEN_PROD_STATIC void add_slider_description(Eina_Strbuf *buf, AtspiAccessibleReadingMaterial *rm)
+{
+       add_percent_value_description(buf, get_percent_value_from_rm(rm));
 }
 
 TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
 {
        AtspiRole role = rm->role;
-       char ret[TTS_MAX_TEXT_SIZE] = { [TTS_MAX_TEXT_SIZE - 1] = 0 };
+       char *ret = NULL;
+       Eina_Strbuf *buf;
+
+       buf = eina_strbuf_new();
+
        switch (role) {
        case ATSPI_ROLE_ENTRY:
        case ATSPI_ROLE_PASSWORD_TEXT: {
@@ -76,23 +63,20 @@ TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
                        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"));
+               ESAL(buf, _("IDS_TPLATFORM_BODY_EDIT_FIELD_M_NOUN_T_TTS"));
                break;
        }
        case ATSPI_ROLE_COMBO_BOX: {
-               int children_count = rm->child_count;
-               g_snprintf(ret, sizeof(ret), "%s", _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
+               ESAL(buf, _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
                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);
+                       ESAL(buf, _("IDS_ACCS_BODY_DROPDOWN_LIST_TTS"));
+                       ESAL(buf, " ");
+                       SUPPRESS_FORMAT_ERROR(eina_strbuf_append_printf(buf, _("IDS_WEBVIEW_BODY_SHOWING_PD_ITEMS_TTS"), children_count));
                }
                break;
        }
@@ -100,23 +84,21 @@ TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
                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);
+                               ESAL(buf, _("IDS_GALLERY_OPT_REORDER"));
+                               ESAL(buf, " , ");
+                               ESAL(buf, _("IDS_ACCS_BODY_BUTTON_TTS"));
                        }
                }
                break;
        }
        case ATSPI_ROLE_PUSH_BUTTON: {
-               g_strlcpy(ret, _("IDS_ACCS_BODY_BUTTON_TTS"), sizeof(ret) - 1);
+               ESAL(buf, _("IDS_ACCS_BODY_BUTTON_TTS"));
                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));
+                       add_percent_value_description(buf, get_percent_value_from_rm(rm));
                }
                break;
        }
@@ -125,7 +107,7 @@ TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
                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"));
+                               ESAL(buf, _("IDS_ACCS_TBOPT_ALPHABETICAL_INDEX_BAR"));
                }
                break;
        }
@@ -143,11 +125,13 @@ TIZEN_PROD_STATIC char *generate_role_trait(AtspiAccessibleReadingMaterial *rm)
        default: {
                gchar *role_name = rm->localized_role_name;
                if (role_name)
-                       g_strlcpy(ret, role_name, sizeof(ret) - 1);
+                       ESAL(buf, role_name);
        }
        }
+       ret = eina_strbuf_string_steal(buf);
+       eina_strbuf_free(buf);
 
-       return g_strdup(ret);
+       return ret;
 }
 
 TIZEN_PROD_STATIC char *generate_state_trait(AtspiAccessibleReadingMaterial *rm)
@@ -325,7 +309,10 @@ TIZEN_PROD_STATIC char *generate_description_trait(AtspiAccessibleReadingMateria
                break;
        }
        case ATSPI_ROLE_PROGRESS_BAR: {
-               ESAL(buf, _("IDS_ACCS_TBBODY_IN_PROGRESS"));
+               int percent = get_percent_value_from_rm(rm);
+               if (percent < 100) {
+                       ESAL(buf, _("IDS_ACCS_TBBODY_IN_PROGRESS"));
+               }
                break;
        }
        case ATSPI_ROLE_SCROLL_BAR: {
@@ -676,6 +663,28 @@ char* reading_composer_extended_description_get(ReadingComposerData *data)
        return ext_desc;
 }
 
+char* reading_composer_percent_value_description_get(ReadingComposerData *data) {
+       Eina_Strbuf *buf = NULL;
+       AtspiAccessibleReadingMaterial *rm;
+
+       if (!data)
+               return NULL;
+
+       rm = data;
+
+       buf = eina_strbuf_new();
+       if (!buf) {
+               ERROR("CRITICAL: Memory allocation failed!");
+               return NULL;
+       }
+
+       add_percent_value_description(buf, get_percent_value_from_rm(rm));
+
+       char *percent_value_description = eina_strbuf_string_steal(buf);
+       eina_strbuf_free(buf);
+       return percent_value_description;
+}
+
 ReadingComposerData* reading_composer_data_get(AtspiAccessible *obj)
 {
        return obj ? atspi_accessible_get_reading_material(obj, NULL) : NULL;
index 870e3025936a941ca10e132c83e55cfeff9e0833..e7d973a03e203eed24a5530e99fcebc09be9c81e 100644 (file)
@@ -17,6 +17,7 @@
 #include <atspi/atspi.h>
 #include <glib.h>
 #include <string.h>
+#include <math.h>
 
 #include <logger.h>
 #include <utils.h>
@@ -232,19 +233,30 @@ Eina_Bool object_has_highlighted_state(AtspiAccessible *obj)
        return ret;
 }
 
-int get_accuracy(double val, int max_accuracy)
+int get_percent_value(double value, double lower, double upper)
 {
-       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;
+       double add_for_rounding = 0.5f;
+       int mul_for_rounding = 1;
+       int count = 0;
+       for (count = 0; count < MAX_ACCURACY; count++) {
+               add_for_rounding *= 0.1f;
+               mul_for_rounding *= 10;
        }
-       return accuracy;
+
+       int val = (int)((value + copysign(add_for_rounding, value)) * mul_for_rounding);
+       int max_val = (int)((upper + copysign(add_for_rounding, upper)) * mul_for_rounding);
+       int min_val = (int)((lower + copysign(add_for_rounding, lower)) * mul_for_rounding);
+
+       int percent;
+       if (min_val >= max_val)
+               percent = 0;
+       else if (val <= min_val)
+               percent = 0;
+       else if (val >= max_val)
+               percent = 100;
+       else
+               percent = ((val - min_val) / (double)(abs(max_val - min_val))) * 100;
+
+       return percent;
 }