Remove dead code and clean up ecore-x dependency
[profile/ivi/lemolo.git] / dialer / gui.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4 #include <Elementary.h>
5
6 #include "log.h"
7 #include "gui.h"
8 #include "keypad.h"
9 #include "history.h"
10 #include "callscreen.h"
11 #include "ussd.h"
12 #include "util.h"
13 #include "simple-popup.h"
14 #include "i18n.h"
15
16 #ifdef HAVE_TIZEN
17 #include <appcore-efl.h>
18 #ifdef HAVE_UI_GADGET
19 #include <ui-gadget.h>
20 #endif
21 #endif
22
23 static Evas_Object *win = NULL;
24 static Evas_Object *main_layout = NULL;
25 static Evas_Object *keypad = NULL;
26 static Evas_Object *contacts = NULL;
27 static Evas_Object *history = NULL;
28 static Evas_Object *cs = NULL;
29 static Evas_Object *flip = NULL;
30 static Evas_Object *current_view = NULL;
31
32 static OFono_Callback_List_Modem_Node *callback_node_modem_changed = NULL;
33 static OFono_Callback_List_USSD_Notify_Node *callback_node_ussd_notify = NULL;
34 static AMB_Callback_List_Node *callback_node_amb_properties_changed = NULL;
35 static Locale_Callback_List_Node *callback_node_locale_properties_changed = NULL;
36
37 /* XXX elm_flip should just do the right thing, but it does not */
38 static Eina_Bool in_call = EINA_FALSE;
39 static Eina_Bool in_flip_anim = EINA_FALSE;
40
41 static Eina_Bool night_mode = EINA_FALSE;
42
43 Contact_Info *gui_contact_search(const char *number, const char **type)
44 {
45         return contact_search(contacts, number, type);
46 }
47
48 static void _dial_reply(void *data, OFono_Error err,
49                         OFono_Call *call __UNUSED__)
50 {
51         char *number = data;
52
53         if (err != OFONO_ERROR_NONE) {
54                 char buf[1024];
55                 const char *msg = ofono_error_message_get(err);
56                 snprintf(buf, sizeof(buf), _("Could not call %s: %s"),
57                                 number, msg);
58                 gui_simple_popup(_("Error"), buf);
59         }
60
61         free(number);
62 }
63
64 OFono_Pending *gui_dial(const char *number)
65 {
66         char *copy = strdup(number);
67         return ofono_dial(copy, NULL, _dial_reply, copy);
68 }
69
70 static void _gui_set_text(void)
71 {
72         elm_object_part_text_set(cs, "label.hide-keypad", _("Hide Keypad"));
73         elm_object_part_text_set(cs, "label.answer", _("Answer"));
74         elm_object_part_text_set(cs, "label.hangup", _("Hangup"));
75         elm_object_part_text_set(cs, "label.multiparty", _("Conference"));
76         elm_object_part_text_set(cs, "label.multiparty-details-back", _("Back"));
77         elm_object_part_text_set(cs, "label.waiting", _("Waiting..."));
78         elm_object_part_text_set(cs, "elm.text.name", _("Unknown"));
79         elm_object_part_text_set(cs, "elm.text.waiting", _("Unknown"));
80
81         elm_object_part_text_set(keypad, "label.all", _("Decline"));
82         elm_object_part_text_set(keypad, "label.missed", _("Hold + Answer"));
83         elm_object_part_text_set(keypad, "label.clear", _("Hangup + Answer"));
84         elm_object_part_text_set(keypad, "label.edit,done", _("Redial"));
85
86         elm_object_part_text_set(history, "label.all", _("All"));
87         elm_object_part_text_set(history, "label.missed", _("Missed"));
88         elm_object_part_text_set(history, "label.clear", _("Clear"));
89         elm_object_part_text_set(history, "label.edit,done", _("Done"));
90 }
91
92 static void _gui_show(Evas_Object *o)
93 {
94         Last_User_Mode *last;
95
96         last = util_get_last_user_mode();
97         if (o == keypad)
98                 elm_object_signal_emit(main_layout, "show,keypad", "gui");
99         else if (o == contacts)
100                 elm_object_signal_emit(main_layout, "show,contacts", "gui");
101         else if (o == history)
102                 elm_object_signal_emit(main_layout, "show,history", "gui");
103         elm_object_focus_set(o, EINA_TRUE);
104         current_view = o;
105
106         if (last) {
107                 if (current_view == keypad)
108                         last->last_view = DIALER_LAST_VIEW_KEYPAD;
109                 else if (current_view == contacts)
110                         last->last_view = DIALER_LAST_VIEW_CONTACTS;
111                 else if (current_view == history)
112                         last->last_view = DIALER_LAST_VIEW_HISTORY;
113
114                 util_set_last_user_mode(last);
115         }
116 }
117
118 Evas_Object *gui_simple_popup(const char *title, const char *message)
119 {
120         return simple_popup_add(win, title, message);
121 }
122
123 void gui_activate(void)
124 {
125         elm_win_raise(win);
126         elm_win_activate(win);
127         evas_object_show(win);
128
129         /* Automatically enable hfp modem if app is in the foreground */
130         if (!ofono_voice_is_online()) {
131                 ofono_powered_set(EINA_TRUE, NULL, NULL);
132         }
133 }
134
135 void gui_number_set(const char *number, Eina_Bool auto_dial)
136 {
137         _gui_show(keypad);
138         keypad_number_set(keypad, number, auto_dial);
139 }
140
141 void gui_activecall_set(Evas_Object *o)
142 {
143         if (o) {
144                 elm_object_part_content_set(main_layout,
145                                                 "elm.swallow.activecall", o);
146                 elm_object_signal_emit(main_layout, "show,activecall", "gui");
147         } else {
148                 o = elm_object_part_content_unset(
149                         main_layout, "elm.swallow.activecall");
150                 elm_object_signal_emit(main_layout, "hide,activecall", "gui");
151                 evas_object_hide(o);
152         }
153 }
154
155 void gui_contacts_show(void)
156 {
157         _gui_show(contacts);
158         gui_call_exit();
159 }
160
161 void gui_call_enter(void)
162 {
163         gui_activate();
164         if (in_call)
165                 return;
166         in_call = EINA_TRUE;
167         if (in_flip_anim)
168                 return;
169         in_flip_anim = EINA_TRUE;
170         elm_flip_go(flip, ELM_FLIP_ROTATE_Y_CENTER_AXIS);
171         elm_object_focus_set(cs, EINA_TRUE);
172 }
173
174 void gui_call_exit(void)
175 {
176         if (!in_call)
177                 return;
178         in_call = EINA_FALSE;
179         if (in_flip_anim)
180                 return;
181         in_flip_anim = EINA_TRUE;
182         elm_flip_go(flip, ELM_FLIP_ROTATE_Y_CENTER_AXIS);
183         elm_object_focus_set(cs, EINA_FALSE);
184 }
185
186 static void _gui_call_sync(void *data __UNUSED__, Evas_Object *o __UNUSED__,
187                                 void *event_info __UNUSED__)
188 {
189         Eina_Bool showing_call = !elm_flip_front_visible_get(flip);
190
191         if (showing_call ^ in_call) {
192                 DBG("Flip back to sync");
193                 elm_flip_go(flip, ELM_FLIP_ROTATE_Y_CENTER_AXIS);
194                 elm_object_focus_set(cs, in_call);
195         }
196         in_flip_anim = EINA_FALSE;
197 }
198
199 static void _gui_voicemail(void)
200 {
201         const char *number = ofono_voicemail_number_get();
202         EINA_SAFETY_ON_NULL_RETURN(number);
203         EINA_SAFETY_ON_FALSE_RETURN(*number != '\0');
204
205         gui_dial(number);
206 }
207
208 static void _gui_quit(void)
209 {
210         elm_exit();
211 }
212
213 static void _on_del(void *data __UNUSED__, Evas *e __UNUSED__,
214                         Evas_Object *obj __UNUSED__, void *event __UNUSED__)
215 {
216         _gui_quit();
217 }
218
219 static void _on_clicked(void *data __UNUSED__, Evas_Object *o __UNUSED__,
220                         const char *emission, const char *source __UNUSED__)
221 {
222         DBG("signal: %s", emission);
223
224         EINA_SAFETY_ON_FALSE_RETURN(eina_str_has_prefix(emission, "clicked,"));
225         emission += strlen("clicked,");
226
227         if (strcmp(emission, "keypad") == 0)
228                 _gui_show(keypad);
229         else if (strcmp(emission, "contacts") == 0)
230                 _gui_show(contacts);
231         else if (strcmp(emission, "history") == 0)
232                 _gui_show(history);
233         else if (strcmp(emission, "voicemail") == 0)
234                 _gui_voicemail();
235         else if (strcmp(emission, "quit") == 0)
236                 _gui_quit();
237 }
238
239 static void _ofono_changed(void *data __UNUSED__)
240 {
241         const char *number;
242         Eina_Bool waiting;
243         unsigned char count;
244         char buf[32];
245
246         if ((ofono_modem_api_get() & OFONO_API_MSG_WAITING) == 0) {
247                 elm_object_signal_emit(main_layout, "disable,voicemail", "gui");
248                 elm_object_signal_emit(main_layout,
249                                         "toggle,off,voicemail", "gui");
250                 elm_object_part_text_set(main_layout, "elm.text.voicemail", "");
251                 return;
252         }
253
254         number = ofono_voicemail_number_get();
255         waiting = ofono_voicemail_waiting_get();
256         count = ofono_voicemail_count_get();
257
258         if (number)
259                 elm_object_signal_emit(main_layout, "enable,voicemail", "gui");
260         else
261                 elm_object_signal_emit(main_layout, "disable,voicemail", "gui");
262
263         if (waiting) {
264                 if (count == 0)
265                         snprintf(buf, sizeof(buf), "*");
266                 else if (count < 255)
267                         snprintf(buf, sizeof(buf), "%d", count);
268                 else
269                         snprintf(buf, sizeof(buf), "255+");
270
271                 elm_object_signal_emit(main_layout,
272                                         "toggle,on,voicemail", "gui");
273         } else {
274                 buf[0] = '\0';
275                 elm_object_signal_emit(main_layout,
276                                         "toggle,off,voicemail", "gui");
277         }
278
279         elm_object_part_text_set(main_layout, "elm.text.voicemail", buf);
280 }
281
282 static void _amb_properties_changed(void *data __UNUSED__)
283 {
284         Eina_Bool night_mode_changed = amb_night_mode_get();
285         if (night_mode != night_mode_changed) {
286                 DBG("Night mode changed to %d", night_mode_changed);
287                 night_mode = night_mode_changed;
288                 util_set_night_mode(night_mode);
289
290                 if (current_view)
291                         _gui_show(current_view);
292         }
293 }
294
295 static void _locale_properties_changed(void *data __UNUSED__)
296 {
297         const char *new_lang = locale_lang_get();
298         if (new_lang) {
299                 if (strncmp(new_lang, "LANG=", 5) == 0)
300                         new_lang += 5;
301
302                 DBG("Switching UI language to %s", new_lang);
303                 setenv ("LANG", new_lang, 1);
304                 setlocale (LC_ALL, new_lang);
305                 _gui_set_text();
306         }
307 }
308
309 static void _ofono_ussd_notify(void *data __UNUSED__, Eina_Bool needs_reply,
310                                 const char *message)
311 {
312         DBG("needs_reply=%d, message=%s", needs_reply, message);
313         ussd_start(message);
314 }
315
316 static void _on_contacts_selected(void *data __UNUSED__,
317                                         Evas_Object *obj __UNUSED__,
318                                         void *event_info)
319 {
320         const char *number = event_info;
321         DBG("Contact selected: %s", number);
322         gui_dial(number);
323 }
324
325 static void _load_last_user_view() {
326         Last_User_Mode *last;
327
328         last = util_get_last_user_mode();
329         if (!last) {
330                 DBG("Last user config file not found - create default view");
331                 last = calloc(1, sizeof(Last_User_Mode));
332                 last->last_view = DIALER_LAST_VIEW_KEYPAD;
333                 last->last_history_view = DIALER_LAST_HISTORY_VIEW_ALL;
334                 last->last_number = eina_stringshare_add("");
335                 util_set_last_user_mode(last);
336         }
337
338         if(last->last_number) {
339                 keypad_number_set(keypad, last->last_number, EINA_FALSE);
340         }
341         if (last->last_view == DIALER_LAST_VIEW_KEYPAD) {
342                 _gui_show(keypad);
343         } else if (last->last_view == DIALER_LAST_VIEW_CONTACTS) {
344                 _gui_show(contacts);
345         } else if (last->last_view == DIALER_LAST_VIEW_HISTORY) {
346                 _gui_show(history);
347                 if (last->last_history_view != DIALER_LAST_HISTORY_VIEW_ALL) {
348                         elm_object_signal_emit(history, "show,missed", "gui");
349                 }
350         }
351         eina_stringshare_del(last->last_number);
352         free(last);
353 }
354
355 Eina_Bool gui_init(void)
356 {
357         Evas_Object *lay, *obj;
358         Evas_Coord w, h;
359         const char *lang;
360
361         /* dialer should never, ever quit */
362         elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
363
364         win = elm_win_util_standard_add("ofono-dialer", "oFono Dialer");
365         EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
366         elm_win_autodel_set(win, EINA_TRUE);
367         evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _on_del, NULL);
368
369 #ifdef HAVE_TIZEN
370 #ifdef HAVE_UI_GADGET
371         UG_INIT_EFL(win, UG_OPT_INDICATOR_PORTRAIT_ONLY);
372 #endif
373 #endif
374
375         /*
376          * check LANG and LC_ALL environment variables,
377          * LC_ALL takes precedence
378          */
379         lang = getenv("LC_ALL");
380         if (!lang)
381                 lang = getenv("LANG");
382
383         setlocale(LC_ALL, lang);
384         bindtextdomain(PACKAGE, LOCALEDIR);
385         textdomain(PACKAGE);
386
387         flip = elm_flip_add(win);
388         evas_object_size_hint_weight_set(flip,
389                                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
390         evas_object_size_hint_align_set(flip, EVAS_HINT_FILL, EVAS_HINT_FILL);
391         elm_win_resize_object_add(win, flip);
392         evas_object_smart_callback_add(flip, "animate,done",
393                                         _gui_call_sync, NULL);
394         evas_object_show(flip);
395
396         main_layout = lay = layout_add(win, "dialer");
397         EINA_SAFETY_ON_NULL_RETURN_VAL(lay, EINA_FALSE);
398         evas_object_size_hint_weight_set(lay,
399                                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
400         evas_object_size_hint_align_set(lay, EVAS_HINT_FILL, EVAS_HINT_FILL);
401         elm_object_part_content_set(flip, "front", lay);
402         evas_object_show(lay);
403
404         elm_object_signal_callback_add(lay, "clicked,*", "gui",
405                                         _on_clicked, NULL);
406
407         keypad = obj = keypad_add(win);
408         EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
409         elm_object_part_content_set(lay, "elm.swallow.keypad", obj);
410
411         contacts = obj = contacts_add(win);
412         evas_object_smart_callback_add(contacts, "selected",
413                                         _on_contacts_selected, NULL);
414         EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
415         elm_object_part_content_set(lay, "elm.swallow.contacts", obj);
416
417         history = obj = history_add(win);
418         EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
419         elm_object_part_content_set(lay, "elm.swallow.history", obj);
420
421         cs = obj = callscreen_add(win);
422         EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
423         evas_object_size_hint_weight_set(obj,
424                                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
425         evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
426         elm_object_part_content_set(flip, "back", obj);
427         evas_object_show(obj);
428
429         _gui_set_text();
430         _load_last_user_view();
431
432         callback_node_modem_changed =
433                 ofono_modem_changed_cb_add(_ofono_changed, NULL);
434         callback_node_ussd_notify =
435                 ofono_ussd_notify_cb_add(_ofono_ussd_notify, NULL);
436         callback_node_amb_properties_changed =
437                 amb_properties_changed_cb_add(_amb_properties_changed, NULL);
438         callback_node_locale_properties_changed =
439                 locale_properties_changed_cb_add(_locale_properties_changed, NULL);
440
441         /* TODO: make it match better with Tizen: icon and other properties */
442         obj = elm_layout_edje_get(lay);
443         edje_object_size_min_get(obj, &w, &h);
444         if ((w == 0) || (h == 0))
445                 edje_object_size_min_restricted_calc(obj, &w, &h, w, h);
446         if ((w == 0) || (h == 0))
447                 edje_object_parts_extends_calc(obj, NULL, NULL, &w, &h);
448         evas_object_resize(win, w, h);
449
450         /* do not show it yet, RC will check if it should be visible or not */
451         return EINA_TRUE;
452 }
453
454 void gui_shutdown(void)
455 {
456 }