From 070121ff43769cf6f821ef4fd15e9e9363590ffa Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Mon, 13 Aug 2012 18:40:11 -0300 Subject: [PATCH] voicemail support. --- Makefile.am | 5 +- data/themes/images/ico_voicemail.png | Bin 0 -> 4060 bytes data/themes/includes/main.edc | 308 ++++++++++++++++++++++++++++++++++- dialer/gui.c | 71 ++++++++ 4 files changed, 375 insertions(+), 9 deletions(-) create mode 100644 data/themes/images/ico_voicemail.png diff --git a/Makefile.am b/Makefile.am index 165dabd..5dbf91b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -73,13 +73,14 @@ data/themes/images/ico_edit.png \ data/themes/images/ico_history.png \ data/themes/images/ico_keypad.png \ data/themes/images/ico_merge.png \ -data/themes/images/ico_multiparty_hangup.png \ data/themes/images/ico_multiparty.png \ +data/themes/images/ico_multiparty_hangup.png \ data/themes/images/ico_multiparty_private.png \ data/themes/images/ico_mute.png \ +data/themes/images/ico_person.png \ data/themes/images/ico_speaker.png \ data/themes/images/ico_swap.png \ -data/themes/images/ico_person.png +data/themes/images/ico_voicemail.png THEME_INCLUDES = \ data/themes/includes/call.edc \ diff --git a/data/themes/images/ico_voicemail.png b/data/themes/images/ico_voicemail.png new file mode 100644 index 0000000000000000000000000000000000000000..fd44a9343c78d1477555d283bb9b60cf15ca140f GIT binary patch literal 4060 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 literal 0 HcmV?d00001 diff --git a/data/themes/includes/main.edc b/data/themes/includes/main.edc index 240da19..51e95f4 100644 --- a/data/themes/includes/main.edc +++ b/data/themes/includes/main.edc @@ -29,6 +29,7 @@ group { image: "ico_keypad.png" COMP; image: "ico_contacts.png" COMP; image: "ico_history.png" COMP; + image: "ico_voicemail.png" COMP; } parts { @@ -165,8 +166,8 @@ group { state: "default" 0.0; \ color: 255 255 255 0; \ color_class: "action"; \ - min: ACTION_WIDTH ACTION_HEIGHT; \ - max: ACTION_WIDTH ACTION_HEIGHT; \ + min: (WIDTH / 4) ACTION_HEIGHT; \ + max: (WIDTH / 4) ACTION_HEIGHT; \ fixed: 1 1; \ rel1 { \ to: "bg.actions"; \ @@ -230,8 +231,8 @@ group { state: "default" 0.0; \ color: 255 255 255 0; \ color_class: "action"; \ - min: ACTION_WIDTH ACTION_HEIGHT; \ - max: ACTION_WIDTH ACTION_HEIGHT; \ + min: (WIDTH / 4) ACTION_HEIGHT; \ + max: (WIDTH / 4) ACTION_HEIGHT; \ fixed: 1 1; \ visible: 0; \ rel1 { \ @@ -348,11 +349,304 @@ group { } \ } - ACTION_TOGGLE("keypad", 0.000000000, 0.333333333); - ACTION_TOGGLE("contacts", 0.333333333, 0.666666666); - ACTION_TOGGLE("history", 0.666666666, 1.000000000); + ACTION_TOGGLE("keypad", 0.00, 0.25); + ACTION_TOGGLE("contacts", 0.25, 0.50); + ACTION_TOGGLE("history", 0.50, 0.75); #undef ACTION_TOGGLE + part { + name: "clipper.disable.voicemail"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 255 255 255 128; + } + } + part { + name: "button.voicemail"; + type: RECT; + mouse_events: 1; + clip_to: "clipper.toggle.voicemail-hidden"; + description { + state: "default" 0.0; + color: 255 255 255 0; + color_class: "action"; + min: (WIDTH / 4) ACTION_HEIGHT; + max: (WIDTH / 4) ACTION_HEIGHT; + fixed: 1 1; + rel1 { + to: "bg.actions"; + relative: 0.75 0.0; + } + rel2 { + to: "bg.actions"; + relative: 1.0 1.0; + offset: -1 -1; + } + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "button.ico.voicemail"; + type: IMAGE; + mouse_events: 0; + clip_to: "clipper.toggle.voicemail-hidden"; + description { + state: "default" 0.0; + color: 255 255 255 255; + color_class: "action"; + min: ACTION_HEIGHT ACTION_HEIGHT; + max: ACTION_HEIGHT ACTION_HEIGHT; + fixed: 1 1; + rel1.to: "button.voicemail"; + rel2.to: "button.voicemail"; + image.normal: "ico_voicemail.png"; + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + color_class: "bg"; + } + } + part { + name: "clipper.toggle.voicemail-hidden"; + type: RECT; + mouse_events: 0; + clip_to: "clipper.disable.voicemail"; + description { + state: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + description { + state: "on" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + visible: 0; + } + } + part { + name: "clipper.toggle.voicemail-visible"; + type: RECT; + mouse_events: 0; + clip_to: "clipper.disable.voicemail"; + description { + state: "default" 0.0; + color: 255 255 255 0; + visible: 0; + } + description { + state: "on" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + } + part { + name: "button.toggle.voicemail"; + type: RECT; + mouse_events: 1; + clip_to: "clipper.toggle.voicemail-visible"; + description { + state: "default" 0.0; + color: 255 255 255 0; + color_class: "caution"; + min: (WIDTH / 4) ACTION_HEIGHT; + max: (WIDTH / 4) ACTION_HEIGHT; + fixed: 1 1; + rel1 { + to: "bg.actions"; + relative: 0.75 0.0; + } + rel2 { + to: "bg.actions"; + relative: 1.0 1.0; + offset: -1 -1; + } + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "button.toggle.ico.voicemail"; + type: IMAGE; + mouse_events: 0; + clip_to: "clipper.toggle.voicemail-visible"; + description { + state: "default" 0.0; + color: 255 255 255 255; + color_class: "caution"; + min: ACTION_HEIGHT ACTION_HEIGHT; + max: ACTION_HEIGHT ACTION_HEIGHT; + fixed: 1 1; + rel1.to: "button.toggle.voicemail"; + rel2.to: "button.toggle.voicemail"; + image.normal: "ico_voicemail.png"; + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + color_class: "bg"; + } + } + part { + name: "elm.text.voicemail"; + type: TEXT; + mouse_events: 0; + clip_to: "clipper.toggle.voicemail-visible"; + description { + state: "default" 0.0; + color_class: "caution"; + rel1 { + to: "button.voicemail"; + offset: 0 (ITEM_PADDING / 2); + } + rel2.to: "button.voicemail"; + align: 0.5 0.0; + text { + font: FONT_NORMAL; + size: SIZE_MEDIUM; + max: 1 1; + } + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + color_class: "bg"; + } + } + part { + name: "blocker.voicemail"; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + programs { + program { + signal: "mouse,up,1"; + source: "button.voicemail"; + action: SIGNAL_EMIT "released,voicemail" "gui"; + after: "show_up_voicemail"; + api: id"_released" id" was released"; + } + program { + name: "show_up_voicemail"; + action: STATE_SET "default" 0.0; + transition: DECELERATE 0.1; + target: "button.voicemail"; + target: "button.ico.voicemail"; + } + program { + signal: "mouse,down,1"; + source: "button.voicemail"; + after: "show_down_voicemail"; + action: SIGNAL_EMIT "pressed,voicemail" "gui"; + api: id"_pressed" id" was pressed"; + } + program { + name: "show_down_voicemail"; + action: STATE_SET "pressed" 0.0; + transition: ACCELERATE 0.1; + target: "button.voicemail"; + target: "button.ico.voicemail"; + } + program { + signal: "mouse,clicked,1"; + source: "button.voicemail"; + action: SIGNAL_EMIT "clicked,voicemail" "gui"; + api: id"_clicked" id" was clicked"; + } + + program { + signal: "mouse,up,1"; + source: "button.toggle.voicemail"; + action: SIGNAL_EMIT "released,voicemail" "gui"; + after: "show_up_toggle_voicemail"; + api: id"_released" id" was released"; + } + program { + name: "show_up_toggle_voicemail"; + action: STATE_SET "default" 0.0; + transition: DECELERATE 0.1; + target: "button.toggle.voicemail"; + target: "button.toggle.ico.voicemail"; + target: "elm.text.voicemail"; + } + program { + signal: "mouse,down,1"; + source: "button.toggle.voicemail"; + after: "show_down_toggle_voicemail"; + action: SIGNAL_EMIT "pressed,voicemail" "gui"; + api: id"_pressed" id" was pressed"; + } + program { + name: "show_down_toggle_voicemail"; + action: STATE_SET "pressed" 0.0; + transition: ACCELERATE 0.1; + target: "button.toggle.voicemail"; + target: "button.toggle.ico.voicemail"; + target: "elm.text.voicemail"; + } + program { + signal: "mouse,clicked,1"; + source: "button.toggle.voicemail"; + action: SIGNAL_EMIT "clicked,voicemail" "gui"; + api: id"_clicked" id" was clicked"; + } + + program { + signal: "toggle,on,voicemail"; + source: "gui"; + action: STATE_SET "on" 0.0; + target: "clipper.toggle.voicemail-hidden"; + target: "clipper.toggle.voicemail-visible"; + } + program { + signal: "toggle,off,voicemail"; + source: "gui"; + action: STATE_SET "default" 0.0; + target: "clipper.toggle.voicemail-hidden"; + target: "clipper.toggle.voicemail-visible"; + } + + program { + signal: "enable,voicemail"; + source: "gui"; + action: STATE_SET "default" 0.0; + target: "clipper.disable.voicemail"; + target: "blocker.voicemail"; + } + program { + signal: "disable,voicemail"; + source: "gui"; + action: STATE_SET "disabled" 0.0; + target: "clipper.disable.voicemail"; + target: "blocker.voicemail"; + } + } + programs { program { name: "show-keypad-swallow-phase1"; diff --git a/dialer/gui.c b/dialer/gui.c index 0b6c985..e6d1003 100644 --- a/dialer/gui.c +++ b/dialer/gui.c @@ -18,6 +18,8 @@ static Evas_Object *cs = NULL; static Evas_Object *flip = NULL; static char def_theme[PATH_MAX] = ""; +static OFono_Callback_List_Modem_Node *callback_node_modem_changed = NULL; + /* XXX elm_flip should just do the right thing, but it does not */ static Eina_Bool in_call = EINA_FALSE; static Eina_Bool in_flip_anim = EINA_FALSE; @@ -143,6 +145,27 @@ static void _gui_call_sync(void *data __UNUSED__, Evas_Object *o __UNUSED__, in_flip_anim = EINA_FALSE; } +static void _dial_reply(void *data, OFono_Error err, + OFono_Call *call __UNUSED__) +{ + const char *number = data; + + if (err != OFONO_ERROR_NONE) { + char buf[1024]; + snprintf(buf, sizeof(buf), "Could not call: %s", number); + gui_simple_popup("Error", buf); + } +} + +static void _gui_voicemail(void) +{ + const char *number = ofono_voicemail_number_get(); + EINA_SAFETY_ON_NULL_RETURN(number); + EINA_SAFETY_ON_FALSE_RETURN(*number != '\0'); + + ofono_dial(number, NULL, _dial_reply, number); +} + static void _on_clicked(void *data __UNUSED__, Evas_Object *o __UNUSED__, const char *emission, const char *source __UNUSED__) { @@ -157,6 +180,51 @@ static void _on_clicked(void *data __UNUSED__, Evas_Object *o __UNUSED__, _gui_show(contacts); else if (strcmp(emission, "history") == 0) _gui_show(history); + else if (strcmp(emission, "voicemail") == 0) + _gui_voicemail(); +} + +static void _ofono_changed(void *data __UNUSED__) +{ + const char *number; + Eina_Bool waiting; + unsigned char count; + char buf[32]; + + if ((ofono_modem_api_get() & OFONO_API_MSG_WAITING) == 0) { + elm_object_signal_emit(main_layout, "disable,voicemail", "gui"); + elm_object_signal_emit(main_layout, + "toggle,off,voicemail", "gui"); + elm_object_part_text_set(main_layout, "elm.text.voicemail", ""); + return; + } + + number = ofono_voicemail_number_get(); + waiting = ofono_voicemail_waiting_get(); + count = ofono_voicemail_count_get(); + + if (number) + elm_object_signal_emit(main_layout, "enable,voicemail", "gui"); + else + elm_object_signal_emit(main_layout, "disable,voicemail", "gui"); + + if (waiting) { + if (count == 0) + snprintf(buf, sizeof(buf), "*"); + else if (count < 255) + snprintf(buf, sizeof(buf), "%d", count); + else + snprintf(buf, sizeof(buf), "255+"); + + elm_object_signal_emit(main_layout, + "toggle,on,voicemail", "gui"); + } else { + buf[0] = '\0'; + elm_object_signal_emit(main_layout, + "toggle,off,voicemail", "gui"); + } + + elm_object_part_text_set(main_layout, "elm.text.voicemail", buf); } Eina_Bool gui_init(const char *theme) @@ -238,6 +306,9 @@ Eina_Bool gui_init(const char *theme) elm_object_part_content_set(flip, "back", obj); evas_object_show(obj); + callback_node_modem_changed = + ofono_modem_changed_cb_add(_ofono_changed, NULL); + /* TODO: make it match better with Tizen: icon and other properties */ obj = elm_layout_edje_get(lay); edje_object_size_min_get(obj, &w, &h); -- 2.7.4