apply FSL(Flora Software License)
[apps/home/call.git] / ui / vcui-view-keypad.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.tizenopensource.org/license
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17
18 #include "vcui-application.h"
19 #include "vcui-view-keypad.h"
20 #include "vcui-view-common.h"
21
22 static int _vcui_view_keypad_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3);
23 static int _vcui_view_keypad_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2);
24 static int _vcui_view_keypad_onhide(voice_call_view_data_t *view_data);
25 static int _vcui_view_keypad_onshow(voice_call_view_data_t *view_data);
26 static int _vcui_view_keypad_ondestroy(voice_call_view_data_t *view_data);
27 static Evas_Object *__vcui_view_keypad_create_single_line_scrolled_entry(void *content);
28
29 static voice_call_view_data_t s_view = {
30         .type = VIEW_INCALL_KEYPAD_VIEW,
31         .app_data = NULL,
32         .layout = NULL,
33         .onCreate = _vcui_view_keypad_oncreate,
34         .onUpdate = _vcui_view_keypad_onupdate,
35         .onHide = _vcui_view_keypad_onhide,
36         .onShow = _vcui_view_keypad_onshow,
37         .onDestroy = _vcui_view_keypad_ondestroy,
38         .priv = NULL,
39 };
40
41 static void __vcui_view_keypad_on_keypad_down(void *data, Evas_Object *obj, const char *emission, const char *source)
42 {
43         CALL_UI_DEBUG("source(%s)",source);
44
45         char before_dest[KEYPAD_STR_DEFINE_OPEN_SIZE+KEYPAD_ENTRY_DISP_DATA_SIZE+1] = { 0, };
46         char *sub_buffer_pointer = NULL;
47         char entry_dest[KEYPAD_ENTRY_SET_DATA_SIZE+1] = { 0, };
48         char *keypad_source;
49         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
50         vcui_view_keypad_priv_t *priv = NULL;
51
52         if (NULL == vd) {
53                 CALL_UI_DEBUG("\n data is null \n");
54                 return;
55         }
56         priv = (vcui_view_keypad_priv_t *)vd->priv;
57
58         if (strlen(source) >= KEYPAD_ENTRY_DISP_DATA_SIZE) {
59                 CALL_UI_DEBUG("strlen(source) >= DATA_BUF_SIZE(%d)",KEYPAD_ENTRY_DISP_DATA_SIZE);
60                 return;
61         }
62
63         if (strcmp(source, "star") == 0) {
64                 keypad_source = "*";
65         } else if (strcmp(source, "sharp") == 0) {
66                 keypad_source = "#";
67         } else {
68                 keypad_source = (char *)source;
69         }
70
71         _vcui_engine_interface_send_dtmf_number(keypad_source[0]);
72
73         if (strlen(priv->entry_disp_data) == KEYPAD_ENTRY_DISP_DATA_SIZE) {
74                 sub_buffer_pointer = &priv->entry_disp_data[1];
75
76                 snprintf(priv->entry_disp_data, sizeof(priv->entry_disp_data),
77                                  "%s", sub_buffer_pointer);
78                 CALL_UI_DEBUG("priv->entry_disp_data after change [%s]", priv->entry_disp_data);
79         }
80
81         priv->entry_disp_data[priv->data_len] = keypad_source[0];
82         if(priv->data_len < (KEYPAD_ENTRY_DISP_DATA_SIZE-1)) {
83                 priv->data_len++;
84         }
85
86         snprintf(before_dest, sizeof(before_dest),
87                  "<font_size=%d><color=#FFFFFF><shadow_color=#000000><style=outline_shadow>%s",
88                  MAX_DIAL_NUMBER_FONT_SIZE, priv->entry_disp_data);
89
90         snprintf(entry_dest, sizeof(entry_dest),
91                  "%s</style></shadow_color></color></font_size>",
92                  before_dest);
93
94         CALL_UI_DEBUG("entry_dest [%s]", priv->entry_disp_data);
95         elm_entry_entry_set(priv->entry, entry_dest);
96         elm_entry_cursor_end_set(priv->entry);
97 }
98
99 static void __vcui_view_keypad_hide_btn_effect_done(void *data, Evas_Object *obj, const char *emission, const char *source)
100 {
101         CALL_UI_DEBUG("..");
102
103         _vcui_view_auto_change();
104 }
105
106 static void __vcui_view_keypad_hide_btn_cb(void *data, Evas_Object *obj, void *event_info)
107 {
108         CALL_UI_DEBUG("..");
109
110         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
111         vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)vd->priv;
112
113         edje_object_signal_emit(_EDJ(priv->contents), "HIDE", "KEYPADBTN");
114         edje_object_signal_callback_add(_EDJ(priv->contents), "DONE", "HIDEKEYPAD", __vcui_view_keypad_hide_btn_effect_done, data);
115 }
116
117 static void __vcui_view_keypad_end_btn_cb(void *data, Evas_Object *obj, void *event_info)
118 {
119         CALL_UI_DEBUG("..");
120
121         if (_vcui_doc_get_count_unhold() == 1) {
122                 _vcui_engine_end_call();
123         } else if (_vcui_doc_get_count_unhold() > 1) {
124                 _vcui_engine_end_active_calls();
125         } else if (_vcui_doc_get_count_hold() == 1) {
126                 _vcui_engine_end_call();
127         } else if (_vcui_doc_get_count_hold() > 1) {
128                 _vcui_engine_end_held_calls();
129         } else {
130                 CALL_UI_DEBUG("call data is null");
131                 return;
132         }
133
134 }
135
136 voice_call_view_data_t *_vcui_view_keypad_new(vcui_app_call_data_t *ad)
137 {
138
139         s_view.app_data = ad;
140         s_view.priv = calloc(1, sizeof(vcui_view_keypad_priv_t));
141
142         if (!s_view.priv) {
143                 CALL_UI_DEBUG("ERROR!!!!!!!!!!!");
144         }
145
146         return &s_view;
147 }
148
149 static Evas_Object *__vcui_view_keypad_create_hide_button(void *data)
150 {
151         Evas_Object *btn;
152         Evas_Object *layout;
153         Evas_Object *sw;
154
155         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
156         vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)vd->priv;
157         layout = priv->contents;
158
159         sw = edje_object_part_swallow_get(_EDJ(layout), "btn_hide");
160         if (sw) {
161                 edje_object_part_unswallow(_EDJ(layout), sw);
162                 evas_object_del(sw);
163         }
164
165         btn = elm_button_add(layout);
166         elm_object_part_content_set(layout, "btn_hide", btn);
167         elm_object_style_set(btn, "text_only/style_keypad_hide_button");
168         elm_object_text_set(btn, _("IDS_CALL_BUTTON2_HIDE_KEYPAD"));
169         evas_object_smart_callback_add(btn, "clicked", __vcui_view_keypad_hide_btn_cb, vd);
170
171         return layout;
172 }
173
174 static Evas_Object *__vcui_view_keypad_create_end_call(void *data)
175 {
176         Evas_Object *btn;
177         Evas_Object *layout;
178         Evas_Object *sw;
179
180         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
181         vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)vd->priv;
182         layout = priv->contents;
183
184         sw = edje_object_part_swallow_get(_EDJ(layout), "btn_end");
185         if (sw) {
186                 edje_object_part_unswallow(_EDJ(layout), sw);
187                 evas_object_del(sw);
188         }
189
190         btn = elm_button_add(layout);
191         elm_object_part_content_set(layout, "btn_end", btn);
192         elm_object_style_set(btn, "text_only/style_keypad_end_button");
193         elm_object_text_set(btn, _("IDS_CALL_SK3_END_CALL"));
194         evas_object_smart_callback_add(btn, "clicked", __vcui_view_keypad_end_btn_cb, vd);
195
196         return layout;
197 }
198
199 static Evas_Object *__vcui_view_keypad_create_contents(void *data)
200 {
201         if (data == NULL) {
202                 CALL_UI_DEBUG("ERROR");
203                 return NULL;
204         }
205         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
206
207         Evas_Object *eo;
208
209         /* load edje */
210         eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, GRP_KEYPAD);
211         if (eo == NULL)
212                 return NULL;
213
214         return eo;
215 }
216
217 static Evas_Object *__vcui_view_keypad_create_layout_main(Evas_Object *parent)
218 {
219         if (parent == NULL) {
220                 CALL_UI_DEBUG("ERROR");
221                 return NULL;
222         }
223         Evas_Object *ly;
224
225         ly = elm_layout_add(parent);
226         retvm_if(ly == NULL, NULL, "Failed elm_layout_add.");
227
228         elm_layout_theme_set(ly, "standard", "window", "integration");
229         evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
230         elm_win_resize_object_add(parent, ly);
231
232         edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm");
233         edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm");
234         evas_object_show(ly);
235
236         return ly;
237 }
238
239 static void __vcui_view_keypad_draw_keypad_screen(Evas_Object *eo, void *data)
240 {
241         CALL_UI_DEBUG("..");
242
243         int valid = 0;
244         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
245         vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)vd->priv;
246
247         _vcui_show_wallpaper_image(priv->contents);
248
249         if (_vcui_doc_get_count_unhold() == 1) {
250                 priv->now_data = _vcui_doc_get_last_status(CALL_UNHOLD);
251                 if (NULL == priv->now_data) {
252                         CALL_UI_DEBUG("priv->now_data is NULL \n");
253                         return;
254                 }
255                 if (strlen((char *)priv->now_data->call_display) == 0) {
256                         edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", (char *)priv->now_data->call_num);
257                 } else {
258                         edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", (char *)priv->now_data->call_display);
259                 }
260         } else if (_vcui_doc_get_count_unhold() > 1) {
261                 priv->now_data = _vcui_doc_get_last_status(CALL_UNHOLD);
262                 edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", _("IDS_CALL_OPT_CONFERENCE_CALL"));
263         } else if (_vcui_doc_get_count_hold() == 1) {
264                 priv->now_data = _vcui_doc_get_last_status(CALL_HOLD);
265                 if (NULL == priv->now_data) {
266                         CALL_UI_DEBUG("priv->now_data is NULL \n");
267                         return;
268                 }
269
270                 if (strlen((char *)priv->now_data->call_display) == 0) {
271                         edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", (char *)priv->now_data->call_num);
272                 } else {
273                         edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", (char *)priv->now_data->call_display);
274                 }
275         } else if (_vcui_doc_get_count_hold() > 1) {
276                 priv->now_data = _vcui_doc_get_last_status(CALL_HOLD);
277                 edje_object_part_text_set(_EDJ(priv->contents), "txt_call_name", _("IDS_CALL_OPT_CONFERENCE_CALL"));
278         } else {
279                 CALL_UI_DEBUG("call data is null");
280                 return;
281         }
282
283         valid = _vcui_check_valid_eo(priv->contents, "KEYPADVIEW");
284         if (valid == -1) {
285                 CALL_UI_DEBUG("[========== KEYPADVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents);
286                 return;
287         }
288
289         if (NULL == priv->now_data) {
290                 CALL_UI_DEBUG("\n priv->now_data is NULL \n");
291                 return;
292         }
293         _vcui_view_common_set_each_time(priv->now_data->start_time);
294
295         __vcui_view_keypad_create_hide_button(vd);
296         __vcui_view_keypad_create_end_call(vd);
297
298         edje_object_signal_emit(_EDJ(priv->contents), "SHOW", "KEYPADBTN");
299
300         evas_object_show(priv->contents);
301
302 }
303
304 static int _vcui_view_keypad_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3)
305 {
306         CALL_UI_DEBUG("keypad view create!!");
307
308         vcui_app_call_data_t *ad = view_data->app_data;
309         vcui_view_keypad_priv_t *priv = view_data->priv;
310
311         if (!view_data->layout) {
312                 /* Create Main Layout */
313                 view_data->layout = __vcui_view_keypad_create_layout_main(ad->win_main);
314                 if (view_data->layout == NULL) {
315                         CALL_UI_DEBUG("ERROR");
316                         return VC_ERROR;
317                 }
318
319                 /* Create Contents */
320                 priv->contents = __vcui_view_keypad_create_contents(view_data);
321                 elm_object_part_content_set(view_data->layout, "elm.swallow.content", priv->contents);
322
323                 priv->entry = __vcui_view_keypad_create_single_line_scrolled_entry(priv->contents);
324                 memset(priv->entry_disp_data, 0x0, sizeof(priv->entry_disp_data));
325                 priv->data_len = 0;
326
327                 edje_object_signal_callback_add(_EDJ(priv->contents),
328                                                                                 "pad_down", "*",
329                                                                                 __vcui_view_keypad_on_keypad_down, 
330                                                                                 view_data);
331
332                 edje_object_part_swallow(_EDJ(priv->contents), "textblock/textarea", priv->entry);
333                 evas_object_name_set(priv->contents, "KEYPADVIEW");
334                 CALL_UI_DEBUG("[========== KEYPADVIEW: priv->contents Addr : [%p] ==========]", priv->contents);
335         }
336
337         _vcui_view_keypad_onshow(view_data);
338         return VC_NO_ERROR;
339 }
340
341 static int _vcui_view_keypad_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2)
342 {
343         CALL_UI_DEBUG("keypad view update!!");
344
345         _vcui_view_keypad_onshow(view_data);
346         return VC_NO_ERROR;
347 }
348
349 static int _vcui_view_keypad_onhide(voice_call_view_data_t *view_data)
350 {
351         CALL_UI_DEBUG("keypad view hide!!");
352         int valid = 0;
353         vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)view_data->priv;
354
355         valid = _vcui_check_valid_eo(priv->contents, "KEYPADVIEW");
356         if (valid == -1) {
357                 CALL_UI_DEBUG("[========== KEYPADVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents);
358         }
359
360         evas_object_hide(view_data->layout);
361         return VC_NO_ERROR;
362 }
363
364 static int _vcui_view_keypad_onshow(voice_call_view_data_t *view_data)
365 {
366         CALL_UI_DEBUG("keypad view show!!");
367
368         vcui_view_keypad_priv_t *priv = view_data->priv;
369
370         __vcui_view_keypad_draw_keypad_screen(priv->contents, view_data);
371
372         evas_object_hide(view_data->layout);
373         evas_object_show(view_data->layout);
374         elm_object_focus_set(priv->entry, EINA_TRUE);
375         return VC_NO_ERROR;
376 }
377
378 static int _vcui_view_keypad_ondestroy(voice_call_view_data_t *view_data)
379 {
380         CALL_UI_DEBUG("keypad view destroy!!");
381
382         vcui_app_call_data_t *ad = _vcui_get_app_data();
383
384         voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_KEYPAD_VIEW];
385         vcui_view_keypad_priv_t *priv = (vcui_view_keypad_priv_t *)vd->priv;
386
387         if (priv != NULL) {
388                 if (priv->contents) {
389                         evas_object_del(priv->contents);
390                         priv->contents = NULL;
391                 }
392
393                 free(priv);
394                 priv = NULL;
395         }
396
397         if (vd->layout != NULL) {
398                 evas_object_hide(vd->layout);
399                 evas_object_del(vd->layout);
400                 vd->layout = NULL;
401         }
402
403         ad->view_st[VIEW_INCALL_KEYPAD_VIEW] = NULL;
404
405         _vcui_cache_flush();
406
407         return VC_NO_ERROR;
408 }
409
410 static Evas_Object *__vcui_view_keypad_create_single_line_scrolled_entry(void *content)
411 {
412         Evas_Object *en;
413
414         if (content == NULL) {
415                 CALL_UI_DEBUG("content is NULL!");
416                 return NULL;
417         }
418
419         en = elm_entry_add(content);
420         elm_entry_scrollable_set(en, EINA_TRUE);
421
422         elm_entry_select_all(en);
423         elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF,
424                                                 ELM_SCROLLER_POLICY_AUTO);
425
426         elm_entry_bounce_set(en, EINA_FALSE, EINA_FALSE);
427         elm_entry_line_wrap_set(en, ELM_WRAP_WORD);
428         elm_entry_input_panel_enabled_set(en, EINA_FALSE);
429         elm_entry_single_line_set(en, EINA_TRUE);
430         elm_entry_cursor_end_set(en);
431         evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND,
432                                          EVAS_HINT_EXPAND);
433         evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
434
435         evas_object_show(en);
436
437         return en;
438 }