4 #include <Elementary.h>
10 #include "callscreen.h"
15 #include <appcore-efl.h>
16 #include <ui-gadget.h>
20 static Evas_Object *win = NULL;
21 static Evas_Object *main_layout = NULL;
22 static Evas_Object *keypad = NULL;
23 static Evas_Object *contacts = NULL;
24 static Evas_Object *history = NULL;
25 static Evas_Object *cs = NULL;
26 static Evas_Object *flip = NULL;
28 static OFono_Callback_List_Modem_Node *callback_node_modem_changed = NULL;
29 static OFono_Callback_List_USSD_Notify_Node *callback_node_ussd_notify = NULL;
31 /* XXX elm_flip should just do the right thing, but it does not */
32 static Eina_Bool in_call = EINA_FALSE;
33 static Eina_Bool in_flip_anim = EINA_FALSE;
35 Contact_Info *gui_contact_search(const char *number, const char **type)
37 return contact_search(contacts, number, type);
40 static void _dial_reply(void *data, OFono_Error err,
41 OFono_Call *call __UNUSED__)
45 if (err != OFONO_ERROR_NONE) {
47 const char *msg = ofono_error_message_get(err);
48 snprintf(buf, sizeof(buf), "Could not call %s: %s",
50 gui_simple_popup("Error", buf);
56 OFono_Pending *gui_dial(const char *number)
58 char *copy = strdup(number);
59 return ofono_dial(copy, NULL, _dial_reply, copy);
62 static void _gui_show(Evas_Object *o)
65 elm_object_signal_emit(main_layout, "show,keypad", "gui");
66 else if (o == contacts)
67 elm_object_signal_emit(main_layout, "show,contacts", "gui");
68 else if (o == history)
69 elm_object_signal_emit(main_layout, "show,history", "gui");
70 elm_object_focus_set(o, EINA_TRUE);
73 typedef struct _Simple_Popup
79 Ecore_Timer *recalc_timer; /* HACK */
82 static void _popup_close(void *data, Evas_Object *bt __UNUSED__, void *event __UNUSED__)
84 Evas_Object *popup = data;
85 evas_object_del(popup);
88 void gui_simple_popup_title_set(Evas_Object *p, const char *title)
91 elm_object_part_text_set(p, "elm.text.title", title);
92 elm_object_signal_emit(p, "show,title", "gui");
94 elm_object_part_text_set(p, "elm.text.title", "");
95 elm_object_signal_emit(p, "hide,title", "gui");
99 /* HACK: force recalc from an idler to fix elm_entry problem */
100 static Eina_Bool _gui_simple_popup_entries_reeval(void *data)
102 Simple_Popup *ctx = data;
104 elm_entry_calc_force(ctx->message);
106 elm_entry_calc_force(ctx->entry);
107 ctx->recalc_timer = NULL;
111 static void _gui_simple_popup_timer_cancel_if_needed(Simple_Popup *ctx)
113 if (!ctx->recalc_timer)
115 if (ctx->message || ctx->entry)
117 ecore_timer_del(ctx->recalc_timer);
118 ctx->recalc_timer = NULL;
121 static void _gui_simple_popup_message_del(void *data, Evas *e __UNUSED__,
122 Evas_Object *en __UNUSED__,
123 void *einfo __UNUSED__)
125 Simple_Popup *ctx = data;
127 _gui_simple_popup_timer_cancel_if_needed(ctx);
130 static void _gui_simple_popup_entry_del(void *data, Evas *e __UNUSED__,
131 Evas_Object *en __UNUSED__,
132 void *einfo __UNUSED__)
134 Simple_Popup *ctx = data;
136 _gui_simple_popup_timer_cancel_if_needed(ctx);
139 static void _gui_simple_popup_reeval_content(Simple_Popup *ctx)
141 if ((!ctx->message) && (!ctx->entry)) {
142 elm_object_part_content_unset(ctx->popup,
143 "elm.swallow.content");
144 elm_object_signal_emit(ctx->popup, "hide,content", "gui");
145 evas_object_hide(ctx->box);
149 elm_box_unpack_all(ctx->box);
151 elm_box_pack_end(ctx->box, ctx->message);
152 evas_object_show(ctx->message);
155 elm_box_pack_end(ctx->box, ctx->entry);
156 evas_object_show(ctx->entry);
159 elm_object_part_content_set(ctx->popup, "elm.swallow.content",
161 elm_object_signal_emit(ctx->popup, "show,content", "gui");
163 /* HACK: elm_entry is not evaluating properly and the text is
164 * not centered as it should be. Then we must force a
165 * calculation from an timer.
167 if (ctx->recalc_timer)
168 ecore_timer_del(ctx->recalc_timer);
169 ctx->recalc_timer = ecore_timer_add(
170 0.02, _gui_simple_popup_entries_reeval, ctx);
173 void gui_simple_popup_message_set(Evas_Object *p, const char *msg)
175 Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
178 EINA_SAFETY_ON_NULL_RETURN(ctx);
182 evas_object_del(ctx->message);
183 _gui_simple_popup_reeval_content(ctx);
190 en = ctx->message = elm_entry_add(p);
191 elm_object_style_set(en, "dialer-popup");
192 elm_entry_editable_set(en, EINA_FALSE);
193 elm_entry_scrollable_set(en, EINA_TRUE);
194 #if ELM_VERSION_MAJOR == 1 && ELM_VERSION_MINOR < 7
195 /* old, deprecated api */
196 elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF,
197 ELM_SCROLLER_POLICY_AUTO);
199 elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF,
200 ELM_SCROLLER_POLICY_AUTO);
203 evas_object_event_callback_add(en, EVAS_CALLBACK_DEL,
204 _gui_simple_popup_message_del,
206 evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND,
208 evas_object_size_hint_align_set(en, EVAS_HINT_FILL,
212 elm_object_text_set(en, msg);
213 _gui_simple_popup_reeval_content(ctx);
216 void gui_simple_popup_entry_enable(Evas_Object *p)
218 Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
221 EINA_SAFETY_ON_NULL_RETURN(ctx);
225 en = ctx->entry = elm_entry_add(p);
226 elm_object_style_set(en, "dialer-popup-editable");
227 elm_entry_editable_set(en, EINA_TRUE);
228 elm_entry_scrollable_set(en, EINA_TRUE);
229 #if ELM_VERSION_MAJOR == 1 && ELM_VERSION_MINOR < 7
230 /* old, deprecated api */
231 elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF,
232 ELM_SCROLLER_POLICY_AUTO);
234 elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF,
235 ELM_SCROLLER_POLICY_AUTO);
238 evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND,
240 evas_object_size_hint_align_set(en, EVAS_HINT_FILL,
243 evas_object_event_callback_add(en, EVAS_CALLBACK_DEL,
244 _gui_simple_popup_entry_del,
246 _gui_simple_popup_reeval_content(ctx);
249 void gui_simple_popup_entry_disable(Evas_Object *p)
251 Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
252 EINA_SAFETY_ON_NULL_RETURN(ctx);
255 evas_object_del(ctx->entry);
256 _gui_simple_popup_reeval_content(ctx);
259 const char *gui_simple_popup_entry_get(const Evas_Object *p)
261 Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
262 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, NULL);
263 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx->entry, NULL);
264 return elm_object_text_get(ctx->entry);
267 void gui_simple_popup_button_dismiss_set(Evas_Object *p)
269 gui_simple_popup_buttons_set(p,
277 void gui_simple_popup_buttons_set(Evas_Object *p,
278 const char *b1_label,
279 const char *b1_class,
281 const char *b2_label,
282 const char *b2_class,
287 unsigned int count = 0;
290 bt = elm_button_add(p);
291 elm_object_style_set(bt, b1_class ? b1_class : "dialer");
292 elm_object_text_set(bt, b1_label);
293 elm_object_part_content_set(p, "elm.swallow.button1", bt);
294 evas_object_smart_callback_add(bt, "clicked", b1_cb, data);
300 bt = elm_button_add(p);
301 elm_object_style_set(bt, b2_class ? b2_class : "dialer");
302 elm_object_text_set(bt, b2_label);
305 part = "elm.swallow.button2";
307 part = "elm.swallow.button1";
309 elm_object_part_content_set(p, part, bt);
310 evas_object_smart_callback_add(bt, "clicked", b2_cb, data);
315 elm_object_signal_emit(p, "buttons,2", "gui");
316 else if (count == 1) {
317 elm_object_signal_emit(p, "buttons,1", "gui");
318 elm_object_part_content_set(p, "elm.swallow.button2", NULL);
320 elm_object_signal_emit(p, "buttons,0", "gui");
321 elm_object_part_content_set(p, "elm.swallow.button1", NULL);
322 elm_object_part_content_set(p, "elm.swallow.button2", NULL);
326 static void _gui_simple_popup_del(void *data, Evas *e __UNUSED__,
327 Evas_Object *o __UNUSED__,
328 void *event_info __UNUSED__)
330 Simple_Popup *ctx = data;
334 Evas_Object *gui_simple_popup(const char *title, const char *message)
336 Evas_Object *p = layout_add(win, "popup");
339 EINA_SAFETY_ON_NULL_RETURN_VAL(p, NULL);
341 ctx = calloc(1, sizeof(Simple_Popup));
342 EINA_SAFETY_ON_NULL_GOTO(ctx, failed_calloc);
344 evas_object_data_set(p, "simple_popup", ctx);
346 evas_object_event_callback_add(p, EVAS_CALLBACK_DEL,
347 _gui_simple_popup_del, ctx);
349 evas_object_size_hint_weight_set(p, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
350 elm_win_resize_object_add(win, p);
352 ctx->box = elm_box_add(p);
354 gui_simple_popup_title_set(p, title);
355 gui_simple_popup_message_set(p, message);
356 gui_simple_popup_button_dismiss_set(p);
367 void gui_activate(void)
370 elm_win_activate(win);
371 evas_object_show(win);
374 void gui_number_set(const char *number, Eina_Bool auto_dial)
377 keypad_number_set(keypad, number, auto_dial);
380 void gui_activecall_set(Evas_Object *o)
383 elm_object_part_content_set(main_layout,
384 "elm.swallow.activecall", o);
385 elm_object_signal_emit(main_layout, "show,activecall", "gui");
387 o = elm_object_part_content_unset(
388 main_layout, "elm.swallow.activecall");
389 elm_object_signal_emit(main_layout, "hide,activecall", "gui");
394 void gui_contacts_show(void)
400 void gui_call_enter(void)
408 in_flip_anim = EINA_TRUE;
409 elm_flip_go(flip, ELM_FLIP_ROTATE_Y_CENTER_AXIS);
410 elm_object_focus_set(cs, EINA_TRUE);
413 void gui_call_exit(void)
417 in_call = EINA_FALSE;
420 in_flip_anim = EINA_TRUE;
421 elm_flip_go(flip, ELM_FLIP_ROTATE_Y_CENTER_AXIS);
422 elm_object_focus_set(cs, EINA_FALSE);
425 static void _gui_call_sync(void *data __UNUSED__, Evas_Object *o __UNUSED__,
426 void *event_info __UNUSED__)
428 Eina_Bool showing_call = !elm_flip_front_visible_get(flip);
430 if (showing_call ^ in_call) {
431 DBG("Flip back to sync");
432 elm_flip_go(flip, ELM_FLIP_ROTATE_Y_CENTER_AXIS);
433 elm_object_focus_set(cs, in_call);
435 in_flip_anim = EINA_FALSE;
438 static void _gui_voicemail(void)
440 const char *number = ofono_voicemail_number_get();
441 EINA_SAFETY_ON_NULL_RETURN(number);
442 EINA_SAFETY_ON_FALSE_RETURN(*number != '\0');
447 static void _on_clicked(void *data __UNUSED__, Evas_Object *o __UNUSED__,
448 const char *emission, const char *source __UNUSED__)
450 DBG("signal: %s", emission);
452 EINA_SAFETY_ON_FALSE_RETURN(eina_str_has_prefix(emission, "clicked,"));
453 emission += strlen("clicked,");
455 if (strcmp(emission, "keypad") == 0)
457 else if (strcmp(emission, "contacts") == 0)
459 else if (strcmp(emission, "history") == 0)
461 else if (strcmp(emission, "voicemail") == 0)
465 static void _ofono_changed(void *data __UNUSED__)
472 if ((ofono_modem_api_get() & OFONO_API_MSG_WAITING) == 0) {
473 elm_object_signal_emit(main_layout, "disable,voicemail", "gui");
474 elm_object_signal_emit(main_layout,
475 "toggle,off,voicemail", "gui");
476 elm_object_part_text_set(main_layout, "elm.text.voicemail", "");
480 number = ofono_voicemail_number_get();
481 waiting = ofono_voicemail_waiting_get();
482 count = ofono_voicemail_count_get();
485 elm_object_signal_emit(main_layout, "enable,voicemail", "gui");
487 elm_object_signal_emit(main_layout, "disable,voicemail", "gui");
491 snprintf(buf, sizeof(buf), "*");
492 else if (count < 255)
493 snprintf(buf, sizeof(buf), "%d", count);
495 snprintf(buf, sizeof(buf), "255+");
497 elm_object_signal_emit(main_layout,
498 "toggle,on,voicemail", "gui");
501 elm_object_signal_emit(main_layout,
502 "toggle,off,voicemail", "gui");
505 elm_object_part_text_set(main_layout, "elm.text.voicemail", buf);
508 static void _ofono_ussd_notify(void *data __UNUSED__, Eina_Bool needs_reply,
511 DBG("needs_reply=%d, message=%s", needs_reply, message);
515 Eina_Bool gui_init(void)
517 Evas_Object *lay, *obj;
520 /* dialer should never, ever quit */
521 elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_NONE);
523 win = elm_win_util_standard_add("ofono-dialer", "oFono Dialer");
524 EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
525 elm_win_autodel_set(win, EINA_FALSE);
528 appcore_set_i18n("ofono-efl", "en-US");
529 UG_INIT_EFL(win, UG_OPT_INDICATOR_PORTRAIT_ONLY);
532 flip = elm_flip_add(win);
533 evas_object_size_hint_weight_set(flip,
534 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
535 evas_object_size_hint_align_set(flip, EVAS_HINT_FILL, EVAS_HINT_FILL);
536 elm_win_resize_object_add(win, flip);
537 evas_object_smart_callback_add(flip, "animate,done",
538 _gui_call_sync, NULL);
539 evas_object_show(flip);
541 main_layout = lay = layout_add(win, "main");
542 EINA_SAFETY_ON_NULL_RETURN_VAL(lay, EINA_FALSE);
543 evas_object_size_hint_weight_set(lay,
544 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
545 evas_object_size_hint_align_set(lay, EVAS_HINT_FILL, EVAS_HINT_FILL);
546 elm_object_part_content_set(flip, "front", lay);
547 evas_object_show(lay);
549 elm_object_signal_callback_add(lay, "clicked,*", "gui",
552 keypad = obj = keypad_add(win);
553 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
554 elm_object_part_content_set(lay, "elm.swallow.keypad", obj);
556 contacts = obj = contacts_add(win);
557 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
558 elm_object_part_content_set(lay, "elm.swallow.contacts", obj);
560 history = obj = history_add(win);
561 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
562 elm_object_part_content_set(lay, "elm.swallow.history", obj);
566 cs = obj = callscreen_add(win);
567 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
568 evas_object_size_hint_weight_set(obj,
569 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
570 evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
571 elm_object_part_content_set(flip, "back", obj);
572 evas_object_show(obj);
574 callback_node_modem_changed =
575 ofono_modem_changed_cb_add(_ofono_changed, NULL);
576 callback_node_ussd_notify =
577 ofono_ussd_notify_cb_add(_ofono_ussd_notify, NULL);
579 /* TODO: make it match better with Tizen: icon and other properties */
580 obj = elm_layout_edje_get(lay);
581 edje_object_size_min_get(obj, &w, &h);
582 if ((w == 0) || (h == 0))
583 edje_object_size_min_restricted_calc(obj, &w, &h, w, h);
584 if ((w == 0) || (h == 0))
585 edje_object_parts_extends_calc(obj, NULL, NULL, &w, &h);
586 evas_object_resize(win, w, h);
588 /* do not show it yet, RC will check if it should be visible or not */
592 void gui_shutdown(void)