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