Hi,

attached is my attempt at making libphone-ui-shr more helpful in case of errors. There are still more things to do and maybe you won't like the direction I took. Either way, feedback is welcome.

Here is a sample screenshot of the feature in action:

http://linux.fjfi.cvut.cz/~zub/SHR/phoneui-error-msg.png

The motivation behind this patch was to provide more useful error messages that the user will notice, without having to look in log/console.

Currently, there are several different mechanisms used to report errors. It would be nice to consolidate those. And I added one more. :-/ The reason was that I wanted to include an associated GError and the other provided mechanisms (ui_utils_dialog, ui_utils_notify) didn't seem well suited for that.

Best regards,

David
diff --git a/src/util/ui-utils.c b/src/util/ui-utils.c
index 6602f68..c6d9f8c 100644
--- a/src/util/ui-utils.c
+++ b/src/util/ui-utils.c
@@ -593,3 +593,82 @@ ui_utils_entry_utf8_get(Evas_Object *entry)
                return strdup("");
        }
 }
+
+static void
+error_message_ok_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       (void)obj;
+       (void)event_info;
+
+       g_critical("error_message_ok_cb");
+
+       Evas_Object *inwin = (Evas_Object*)data;
+       evas_object_del(inwin);
+}
+
+void
+error_message_show(struct View *parent, const char *error_msg, const char 
*detail_msg)
+{
+       Evas_Object *win = ui_utils_view_window_get(parent);
+
+       Evas_Object *inwin = elm_win_inwin_add(win);
+       //evas_object_event_callback_add(inwin, EVAS_CALLBACK_DEL, 
error_message_del, NULL);
+
+       Evas_Object *box = elm_box_add(win);
+       elm_box_homogenous_set(box, EINA_FALSE);
+       evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+       Evas_Object *heading = elm_label_add(win);
+       //elm_label_line_wrap_set(heading, EINA_TRUE);
+       elm_label_label_set(heading, error_msg);
+       evas_object_size_hint_weight_set(heading, 1.0, 1.0);
+       evas_object_size_hint_align_set(heading, 0.5, 0.5);
+       evas_object_show(heading);
+       elm_box_pack_end(box, heading);
+
+       if (detail_msg) {
+               Evas_Object *lb = elm_label_add(win);
+               elm_label_line_wrap_set(lb, EINA_TRUE);
+               elm_label_label_set(lb, detail_msg);
+               evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+               evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 
EVAS_HINT_FILL);
+               evas_object_show(lb);
+
+               Evas_Object *scroller = elm_scroller_add(win);
+               evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, 
1.0);
+               evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, 
EVAS_HINT_FILL);
+               elm_scroller_content_set(scroller, lb);
+               evas_object_show(scroller);
+
+               elm_box_pack_end(box, scroller);
+       }
+
+       Evas_Object *bt = elm_button_add(win);
+       elm_button_label_set(bt, D_("Ok"));
+       evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
+       evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 1.0);
+       evas_object_smart_callback_add(bt, "clicked", error_message_ok_cb, 
inwin);
+
+       evas_object_show(bt);
+       elm_box_pack_end(box, bt);
+
+       elm_win_inwin_content_set(inwin, box);
+
+       elm_win_inwin_activate(inwin);
+}
+
+void
+error_message_show_from_gerror(struct View *parent, const char *msg,
+       const GError *err)
+{
+       if (err)
+       {
+               gchar *detail_msg = g_strdup_printf("(%d) %s",
+                       err->code, err->message);
+               error_message_show(parent, msg, detail_msg);
+               g_free(detail_msg);
+       }
+       else
+               error_message_show(parent, msg, NULL);
+}
diff --git a/src/util/ui-utils.h b/src/util/ui-utils.h
index abe6a34..48f4da5 100644
--- a/src/util/ui-utils.h
+++ b/src/util/ui-utils.h
@@ -90,4 +90,12 @@ ui_utils_view_inwin_list(struct View *view, GList *list,
 
 char *
 ui_utils_entry_utf8_get(Evas_Object *entry);
+
+void
+error_message_show(struct View *parent, const char *error_msg,
+       const char *detail_msg);
+void
+error_message_show_from_gerror(struct View *parent, const char *msg,
+       const GError *err);
+
 #endif
diff --git a/src/view/contact-list-view.c b/src/view/contact-list-view.c
index a35c26a..9a234c6 100644
--- a/src/view/contact-list-view.c
+++ b/src/view/contact-list-view.c
@@ -325,8 +325,10 @@ _add_contact_cb(GError *error, GHashTable *properties, 
gpointer data)
        (void) data;
        Elm_Genlist_Item *it;
        if (error || !properties) {
-               // FIXME: show some nice notification
-               g_warning("Failed adding a contact");
+               g_warning("Failed adding a contact: (%d) %s",
+                       (error)? error->code : 0, (error)? error->message : 
"NULL");
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Failed adding contact."), error);
                return;
        }
        g_debug("Adding contact to the list");
diff --git a/src/view/contact-view.c b/src/view/contact-view.c
index 1ae5bd8..9b11b98 100644
--- a/src/view/contact-view.c
+++ b/src/view/contact-view.c
@@ -688,7 +688,10 @@ _update_cb(GError *error, gpointer data)
 {
        struct ContactViewData *view = data;
        if (error) {
-               g_warning("Updating contact %s failed", view->path);
+               g_warning("Updating contact %s failed: (%d) %s", view->path,
+                       error->code, error->message);
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Updating contact failed."), error);
        }
        else {
                _set_modify(view, 0);
@@ -700,7 +703,10 @@ _add_cb(GError *error, char *path, gpointer data)
 {
        struct ContactViewData *view = data;
        if (error) {
-               g_warning("Adding the contact failed");
+               g_warning("Adding the contact failed: (%d) %s",
+                       error->code, error->message);
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Adding the contact failed."), error);
        }
        else {
                view->path = path;
@@ -715,8 +721,10 @@ _load_cb(GError *error, GHashTable *content, gpointer data)
        struct ContactViewData *view = (struct ContactViewData *)data;
        g_debug("_load_cb called");
        if (error || !content) {
-               // FIXME: show some nice notification
-               g_critical("Failed loading data of saved contact");
+               g_critical("Failed loading data of saved contact: (%d) %s",
+                       (error)? error->code : 0, (error)? error->message : 
"NULL");
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Failed loading data of saved contact."), error);
                return;
        }
        /* cleanup up the old data of the contact */
diff --git a/src/view/dialer-view.c b/src/view/dialer-view.c
index d234769..44cfc5d 100644
--- a/src/view/dialer-view.c
+++ b/src/view/dialer-view.c
@@ -376,8 +376,15 @@ _dialer_call_initiated_cb(GError * error, int call_id, 
void *userdata)
 {
        (void) userdata;
        (void) call_id;
-       (void) error;
-       /*FIXME: Handle errors */
-       dialer_view_hide();
+
+       if (error)
+       {
+               g_warning("Cannot initiate call: (%d) %s", error->code,
+                       error->message);
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Cannot initiate call."), error);
+       }
+       else
+               dialer_view_hide();
 }
 
diff --git a/src/view/message-new-view.c b/src/view/message-new-view.c
index d03005c..a027fe5 100644
--- a/src/view/message-new-view.c
+++ b/src/view/message-new-view.c
@@ -738,12 +738,13 @@ _contact_lookup(GError *error, GHashTable *contact, 
gpointer data)
        char *tmp;
        const char *tmp2;
        GValue *gval_tmp;
-       struct _recipient_pack *pack;
+       struct _recipient_pack *pack = (struct _recipient_pack *)data;
 
-       // FIXME: show some nice notification
        if (error) {
                g_warning("Error will trying to resolve number: (%d) %s",
                          error->code, error->message);
+               error_message_show_from_gerror(VIEW_PTR(*pack->view),
+                       D_("Error will trying to resolve number."), error);
                return;
        }
        if (!contact ) {
@@ -751,7 +752,6 @@ _contact_lookup(GError *error, GHashTable *contact, 
gpointer data)
                return;
        }
 
-       pack = (struct _recipient_pack *)data;
        tmp = phoneui_utils_contact_display_name_get(contact);
        if (tmp) {
                g_hash_table_insert(pack->recipient, "Name",
diff --git a/src/view/phone-log-view.c b/src/view/phone-log-view.c
index ecdd1fb..1506ba7 100644
--- a/src/view/phone-log-view.c
+++ b/src/view/phone-log-view.c
@@ -273,8 +273,9 @@ static void
 _contact_lookup(GError *error, GHashTable *contact, gpointer data)
 {
        if (error) {
-               // FIXME: show a nice notification
                g_warning("Contact lookup error: (%d) %s", error->code, 
error->message);
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Contact lookup error."), error);
                return;
        }
        GHashTable *entry = data;
@@ -305,10 +306,16 @@ static void
 _get_callback(GError* error, GHashTable** entry, int count, gpointer data)
 {
        (void) data;
-       (void) error; // FIXME: use it
        GValue *val;
         int i;
 
+       if (error) {
+               g_warning("Cannot retrieve calls list: (%d) %s", error->code, 
error->message);
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Cannot retrieve calls list."), error);
+               return;
+       }
+
        for (i = 0; i < count; i++) {
                g_ptr_array_add(view.calls, entry[i]);
 
diff --git a/src/view/quick-settings-view.c b/src/view/quick-settings-view.c
index 2f7f76b..a8b6de5 100644
--- a/src/view/quick-settings-view.c
+++ b/src/view/quick-settings-view.c
@@ -263,8 +263,10 @@ _set_profile_cb(GError *error, gpointer data)
 {
        (void) data;
        if (error) {
-               // FIXME: show some nice inwin
-               g_warning("Failed setting the profile!");
+               g_warning("Failed setting the profile: (%d) %s",
+                       error->code, error->message);
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Failed setting the profile."), error);
        }
 }
 
@@ -300,7 +302,10 @@ _profiles_list_cb(GError *error, char **list, int count, 
gpointer userdata)
        int i;
 
        if (error || !list) {
-               g_warning("Failed to retrieve profiles list");
+               g_warning("Failed to retrieve profiles list: (%d) %s",
+                       (error)? error->code : 0, (error)? error->message : 
"NULL");
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Failed to retrieve profiles list."), error);
                return;
        }
 
@@ -526,6 +531,8 @@ _pdp_activate_cb(GError *error, gpointer data)
        if (error) {
                g_warning("Activating PDP failed: (%d) %s",
                          error->code, error->message);
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Activating PDP failed."), error);
        }
 }
 
@@ -537,6 +544,8 @@ _pdp_deactivate_cb(GError *error, gpointer data)
        if (error) {
                g_warning("De-Activating PDP failed: (%d) %s",
                          error->code, error->message);
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("De-Activating PDP failed."), error);
        }
 }
 
diff --git a/src/view/sim-manager-view.c b/src/view/sim-manager-view.c
index 18250e9..6a9e888 100644
--- a/src/view/sim-manager-view.c
+++ b/src/view/sim-manager-view.c
@@ -269,8 +269,10 @@ void
 _number_add_add_to_sim(GError *error, gpointer pack)
 {
        if (error) {
-               // FIXME: show notification
-               g_warning("Failed to write to SIM");
+               g_warning("Failed to write to SIM: (%d) %s", error->code,
+                       error->message);
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Failed to write to SIM."), error);
        } else {
                /*
                elm_genlist_clear(view.list_data.list);
@@ -330,7 +332,8 @@ _number_add_find_index_cb(GError *error, int max_index, int 
number_length,
        if (error) {
                g_warning("Failed retrieving Phonebook Info: (%d) %s",
                          error->code, error->message);
-               // FIXME: show notification
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Failed retrieving Phonebook Info."), error);
                g_timeout_add(0, _number_add_destruct, pack);
                return;
        }
@@ -381,8 +384,11 @@ _number_add_contact_get_cb(GError *error, GHashTable 
*properties, gpointer data)
        pack->name = phoneui_utils_contact_display_name_get(properties);
 
        if (error || !properties) {
-               g_warning("Failed to retrieve Contact: %s", pack->path);
-               // FIXME: show notification
+               g_warning("Failed to retrieve contact: %s [error (%d) %s]",
+                       pack->path,     (error)? error->code : 0,
+                       (error)? error->message : "NULL");
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Failed to retrieve contact."), error);
                g_timeout_add(0, _number_add_destruct, pack);
                return;
        }
@@ -730,7 +736,9 @@ _sim_contacts_get_callback(GError *error, 
FreeSmartphoneGSMSIMEntry *entry,
        if (error) {
                g_warning("Failed retrieving SIM Phonebook: (%d) %s",
                          error->code, error->message);
-               // FIXME: show notification and destroy SIM Manager
+               error_message_show_from_gerror(VIEW_PTR(view),
+                       D_("Failed retrieving SIM Phonebook."), error);
+               // FIXME: destroy SIM Manager
                return;
        }
 
_______________________________________________
Shr-devel mailing list
[email protected]
http://lists.shr-project.org/mailman/listinfo/shr-devel

Reply via email to