Fixed N_SE-9450
[apps/home/call.git] / ui / src / vcui-view-multi-call-split.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-document.h"
20 #include "vcui-view-elements.h"
21 #include "vcui-view-multi-call-split.h"
22 #include "vcui-view-keypad.h"
23
24 #define VCUI_VIEW_MULTICALL_SPLIT_LAYOUT_ID "MULTIVIEWSPLIT"
25 typedef struct {
26         Evas_Object *contents;
27         Evas_Object *caller_info_unhold;
28         Evas_Object *caller_info_hold;
29         Evas_Object *btn_ly;
30
31         Evas_Object *record_btn;
32
33 } incall_multi_view_split_priv_t;
34
35 static int __vcui_view_multi_call_split_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3);
36 static int __vcui_view_multi_call_split_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2);
37 static int __vcui_view_multi_call_split_onhide(voice_call_view_data_t *view_data);
38 static int __vcui_view_multi_call_split_onshow(voice_call_view_data_t *view_data);
39 static int __vcui_view_multi_call_split_ondestroy(voice_call_view_data_t *view_data);
40 static void __vcui_multi_view_split_rotation_with_resize();
41
42 static voice_call_view_data_t s_view = {
43         .type = VIEW_INCALL_MULTICALL_SPLIT_VIEW,
44         .app_data = NULL,
45         .layout = NULL,
46         .onCreate = __vcui_view_multi_call_split_oncreate,
47         .onUpdate = __vcui_view_multi_call_split_onupdate,
48         .onHide = __vcui_view_multi_call_split_onhide,
49         .onShow = __vcui_view_multi_call_split_onshow,
50         .onDestroy = __vcui_view_multi_call_split_ondestroy,
51         .priv = NULL,
52 };
53
54 voice_call_view_data_t *_vcui_view_multi_call_split_new(vcui_app_call_data_t *ad)
55 {
56         s_view.app_data = ad;
57         s_view.priv = calloc(1, sizeof(incall_multi_view_split_priv_t));
58
59         if (!s_view.priv) {
60                 CALL_UI_DEBUG("ERROR!!!!!!!!!!!");
61         }
62
63         return &s_view;
64 }
65
66 static void __vcui_view_multi_call_split_draw_screen(Evas_Object *eo, void *data)
67 {
68         CALL_UI_DEBUG("..");
69
70         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
71         incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)vd->priv;
72
73         vcui_app_call_data_t *ad = vd->app_data;
74
75         call_data_t *hold_call_data = NULL;
76         call_data_t *unhold_call_data = NULL;
77
78         char buf[DEF_BUF_LEN] = { 0, };
79
80         hold_call_data = _vcui_doc_get_call_data_by_call_status(CALL_HOLD);
81         unhold_call_data = _vcui_doc_get_call_data_by_call_status(CALL_UNHOLD);
82
83         if ((hold_call_data == NULL) || (unhold_call_data == NULL)) {
84                 CALL_UI_DEBUG("call data is null");
85                 return;
86         }
87
88         char *hold_file_path = _vcui_doc_get_caller_id_file_path(hold_call_data);
89         char *hold_full_file_path = _vcui_doc_get_caller_id_full_file_path(hold_call_data);
90         char *unhold_file_path = _vcui_doc_get_caller_id_file_path(unhold_call_data);
91         char *unhold_full_file_path = _vcui_doc_get_caller_id_full_file_path(unhold_call_data);
92         char *hold_call_number = _vcui_doc_get_call_number(hold_call_data);
93         char *hold_call_name = _vcui_doc_get_call_display_name(hold_call_data);
94         char *unhold_call_number = _vcui_doc_get_call_number(unhold_call_data);
95         char *unhold_call_name = _vcui_doc_get_call_display_name(unhold_call_data);
96
97         if (_vcui_doc_get_unhold_call_data_count() == 1 && _vcui_doc_get_hold_call_data_count() == 1) {
98                 /* in call */
99                 _vcui_show_contact_image_split(eo, unhold_file_path, unhold_full_file_path, EINA_FALSE);
100
101                 if (strlen(unhold_call_name) == 0) {
102                         _vcui_show_caller_info_name(vd, unhold_call_number, EINA_FALSE);
103                         _vcui_show_caller_info_number(vd, NULL, EINA_FALSE);
104                 } else {
105                         _vcui_show_caller_info_name(vd, unhold_call_name, EINA_FALSE);
106                         _vcui_show_caller_info_number(vd, unhold_call_number, EINA_FALSE);
107                 }
108
109                 /* on hold */
110                 _vcui_show_contact_image_split(eo, hold_file_path, hold_full_file_path, EINA_TRUE);
111                 if (strlen(hold_call_name) == 0) {
112                         _vcui_show_caller_info_name(vd, hold_call_number, EINA_TRUE);
113                         _vcui_show_caller_info_number(vd, NULL, EINA_TRUE);
114                 } else {
115                         _vcui_show_caller_info_name(vd, hold_call_name, EINA_TRUE);
116                         _vcui_show_caller_info_number(vd, hold_call_number, EINA_TRUE);
117                 }
118
119         } else if (_vcui_doc_get_unhold_call_data_count() == 1 && _vcui_doc_get_hold_call_data_count() > 1) {
120                 /* in call */
121                 _vcui_show_contact_image_split(eo, hold_file_path, hold_full_file_path, EINA_FALSE);
122
123                 if (strlen(unhold_call_name) == 0) {
124                         _vcui_show_caller_info_name(vd, unhold_call_number, EINA_FALSE);
125                         _vcui_show_caller_info_number(vd, NULL, EINA_FALSE);
126                 } else {
127                         _vcui_show_caller_info_name(vd, unhold_call_name, EINA_FALSE);
128                         _vcui_show_caller_info_number(vd, unhold_call_number, EINA_FALSE);
129                 }
130
131                 /* on hold */
132                 _vcui_show_contact_image_split(eo, CONF_SPLIT_ICON, CONF_SPLIT_ICON, EINA_TRUE);
133                 _vcui_show_caller_info_name(vd, _("IDS_CALL_OPT_CONFERENCE_CALL"), EINA_TRUE);
134                 snprintf(buf, DEF_BUF_LEN, "%d %s", _vcui_doc_get_hold_call_data_count(), _("IDS_CALL_BODY_PEOPLE"));
135                 _vcui_show_caller_info_number(vd, buf, EINA_TRUE);
136
137         } else if (_vcui_doc_get_unhold_call_data_count() > 1 && _vcui_doc_get_hold_call_data_count() == 1) {
138                 /* in call */
139                 _vcui_show_contact_image_split(eo, CONF_SPLIT_ICON, CONF_SPLIT_ICON, EINA_FALSE);
140                 _vcui_show_caller_info_name(vd, _("IDS_CALL_OPT_CONFERENCE_CALL"), EINA_FALSE);
141                 snprintf(buf, DEF_BUF_LEN, "%d %s", _vcui_doc_get_unhold_call_data_count(), _("IDS_CALL_BODY_PEOPLE"));
142                 _vcui_show_caller_info_number(vd, buf, EINA_FALSE);
143
144                 /* on hold */
145                 _vcui_show_contact_image_split(eo, hold_file_path, hold_full_file_path, EINA_TRUE);
146                 if (strlen(hold_call_name) == 0) {
147                         _vcui_show_caller_info_name(vd, hold_call_number, EINA_TRUE);
148                         _vcui_show_caller_info_number(vd, NULL, EINA_TRUE);
149                 } else {
150                         _vcui_show_caller_info_name(vd, hold_call_name, EINA_TRUE);
151                         _vcui_show_caller_info_number(vd, hold_call_number, EINA_TRUE);
152                 }
153
154                 /* enter conf list view */
155         } else {
156                 CALL_UI_DEBUG("[=========== ERROR : Invalid Status!!! ============]");
157                 return;
158         }
159
160         _vcui_show_call_bg_img(priv->contents);
161         _vcui_show_caller_info_status(vd, _("IDS_CALL_BODY_ON_HOLD_ABB"), EINA_TRUE);
162
163         _vcui_show_caller_info_icon(vd, EINA_FALSE);
164
165         _vcui_view_common_set_each_time(_vcui_doc_get_call_start_time(unhold_call_data));
166
167         /*create a small button for Hold/Swap*/
168         _vcui_create_hold_swap_button(vd);
169
170         if ((_vcui_is_phonelock_status() == EINA_TRUE) && (_vcui_is_idle_lock() == EINA_TRUE)) {
171                 _vcui_create_top_middle_button_disabled(vd);
172         } else {
173                 _vcui_create_top_middle_button(vd);
174         }
175
176         _vcui_create_top_right_button(vd);
177         _vcui_create_bottom_left_button(vd);
178         _vcui_create_bottom_middle_button(vd);
179
180         {
181                 if ((_vcui_doc_get_unhold_call_data_count() == 5 && _vcui_doc_get_hold_call_data_count() == 1)
182                         || (_vcui_doc_get_unhold_call_data_count() == 1 && _vcui_doc_get_hold_call_data_count() == 5)) {
183                         _vcui_create_top_left_button_disabled(vd);
184                 } else {
185                         _vcui_create_top_left_button(vd);
186                 }
187                 if (_vcui_view_common_is_emul_bin() == EINA_TRUE) {
188                         _vcui_create_bottom_right_button_disabled(vd);
189                 } else {
190                         _vcui_create_bottom_right_button(vd);
191                 }
192         }
193
194         ad->beffect_needed = EINA_FALSE;
195
196         __vcui_multi_view_split_rotation_with_resize();
197
198         _vcui_elements_check_keypad_n_hide(vd);
199
200         evas_object_show(eo);
201 }
202
203 static Evas_Object *__vcui_view_multi_call_split_create_contents(void *data, char *group)
204 {
205         if (data == NULL) {
206                 CALL_UI_DEBUG("ERROR");
207                 return NULL;
208         }
209         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
210
211         Evas_Object *eo = NULL;
212
213         /* load edje */
214         eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, group);
215         if (eo == NULL)
216                 return NULL;
217
218         return eo;
219 }
220
221 static Evas_Object *__vcui_view_multi_call_split_create_layout_main(Evas_Object *parent)
222 {
223         if (parent == NULL) {
224                 CALL_UI_DEBUG("ERROR");
225                 return NULL;
226         }
227
228         Evas_Object *ly;
229         ly = elm_layout_add(parent);
230         retvm_if(ly == NULL, NULL, "Failed elm_layout_add.");
231
232         elm_layout_theme_set(ly, "standard", "window", "integration");
233         evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
234         elm_win_resize_object_add(parent, ly);
235
236         edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm");
237         edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm");
238         evas_object_show(ly);
239
240         return ly;
241 }
242
243 static int __vcui_view_multi_call_split_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3)
244 {
245         CALL_UI_DEBUG("multi-split view create");
246
247         voice_call_view_data_t *vd = view_data;
248         incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)view_data->priv;
249
250         if (!vd->layout) {
251                 Evas_Object * sep_ly = NULL;
252                 vd->layout = __vcui_view_multi_call_split_create_layout_main(vd->app_data->win_main);
253                 if (vd->layout == NULL) {
254                         CALL_UI_DEBUG("ERROR");
255                         return VC_ERROR;
256                 }
257
258                 priv->contents = __vcui_view_multi_call_split_create_contents(view_data, GRP_MULTICALL_SPLIT);
259                 elm_object_part_content_set(view_data->layout, "elm.swallow.content", priv->contents);
260
261                 sep_ly = __vcui_view_multi_call_split_create_contents(view_data, GRP_SEPARATOR_LAYOUT);
262                 elm_object_part_content_set(priv->contents, "btn_bg", sep_ly);
263
264                 priv->btn_ly = __vcui_view_multi_call_split_create_contents(view_data, GRP_BUTTON_LAYOUT);
265                 elm_object_part_content_set(priv->contents, "btn_region", priv->btn_ly);
266
267                 priv->caller_info_unhold = __vcui_view_multi_call_split_create_contents(view_data, GRP_CALLER_INFO);
268                 elm_object_part_content_set(priv->contents, "caller_info_unhold", priv->caller_info_unhold);
269                 edje_object_signal_emit(_EDJ(priv->caller_info_unhold), "set-unhold-state", "call-screen");
270
271                 priv->caller_info_hold = __vcui_view_multi_call_split_create_contents(view_data, GRP_CALLER_INFO);
272                 elm_object_part_content_set(priv->contents, "caller_info_hold", priv->caller_info_hold);
273                 edje_object_signal_emit(_EDJ(priv->caller_info_hold), "set-hold-caller_ifno", "call-screen");
274
275                 evas_object_name_set(priv->contents, VCUI_VIEW_MULTICALL_SPLIT_LAYOUT_ID);
276                 CALL_UI_DEBUG("[========== MULTIVIEWSPLIT: priv->contents Addr : [%p] ==========]", priv->contents);
277
278         } else {
279                 CALL_UI_DEBUG("[UI]ad->layout_incall==NULL case ");
280                 evas_object_show(vd->layout);
281         }
282
283         __vcui_view_multi_call_split_onshow(view_data);
284         return VC_NO_ERROR;
285 }
286
287 static int __vcui_view_multi_call_split_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2)
288 {
289         CALL_UI_DEBUG("multi-split view update");
290
291         __vcui_view_multi_call_split_onshow(view_data);
292         return VC_NO_ERROR;
293 }
294
295 static int __vcui_view_multi_call_split_onhide(voice_call_view_data_t *view_data)
296 {
297         CALL_UI_DEBUG("multi-split view hide");
298
299         evas_object_hide(view_data->layout);
300         return VC_NO_ERROR;
301 }
302
303 static int __vcui_view_multi_call_split_onshow(voice_call_view_data_t *view_data)
304 {
305         CALL_UI_DEBUG("multi-split view show");
306
307         incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)view_data->priv;
308
309         __vcui_view_multi_call_split_draw_screen(priv->contents, view_data);
310
311         evas_object_hide(view_data->layout);
312         evas_object_show(view_data->layout);
313         return VC_NO_ERROR;
314 }
315
316 static int __vcui_view_multi_call_split_ondestroy(voice_call_view_data_t *view_data)
317 {
318         CALL_UI_DEBUG("multi-split view destroy");
319
320         vcui_app_call_data_t *ad = _vcui_get_app_data();
321         voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_MULTICALL_SPLIT_VIEW];
322
323         incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)vd->priv;
324         if (priv != NULL) {
325                 if (priv->btn_ly) {
326                         evas_object_del(priv->btn_ly);
327                         priv->btn_ly = NULL;
328                 }
329
330                 if (priv->caller_info_hold) {
331                         evas_object_del(priv->caller_info_hold);
332                         priv->caller_info_hold = NULL;
333                 }
334
335                 if (priv->caller_info_unhold) {
336                         evas_object_del(priv->caller_info_unhold);
337                         priv->caller_info_unhold = NULL;
338                 }
339
340                 /*Delete keypad layout*/
341                 _vcui_keypad_delete_layout(priv->contents);
342
343                 if (priv->contents) {
344                         evas_object_del(priv->contents);
345                         priv->contents = NULL;
346                 }
347                 free(priv);
348                 priv = NULL;
349         }
350
351         if (vd->layout != NULL) {
352                 evas_object_hide(vd->layout);
353                 evas_object_del(vd->layout);
354                 vd->layout = NULL;
355         }
356         ad->view_st[VIEW_INCALL_MULTICALL_SPLIT_VIEW] = NULL;
357
358         _vcui_cache_flush();
359
360         return VC_NO_ERROR;
361 }
362
363 static void __vcui_multi_view_split_rotation_with_resize()
364 {
365         CALL_UI_DEBUG("..");
366         vcui_app_call_data_t *ad = _vcui_get_app_data();
367         voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_MULTICALL_SPLIT_VIEW];
368         incall_multi_view_split_priv_t *priv = (incall_multi_view_split_priv_t *)vd->priv;
369
370         elm_win_rotation_with_resize_set(ad->win_main, ad->rotate_angle);
371         elm_win_rotation_with_resize_set(ad->popup_mw, ad->rotate_angle);
372
373         if (ad->rotate_angle == 0 || ad->rotate_angle == 180) {
374                 CALL_UI_DEBUG("portrait mode signal emit");
375                 edje_object_signal_emit(_EDJ(priv->contents), "set-portrait", "incall-split-view");
376         } else if (ad->rotate_angle == 90 || ad->rotate_angle == 270) {
377                 CALL_UI_DEBUG("landscape mode not supported");
378         }
379
380         evas_object_show(vd->layout);
381 }
382
383 int     _vcui_view_multi_call_split_check_valid_eo(voice_call_view_data_t *vd)
384 {
385         CALL_UI_DEBUG("..");
386
387         incall_multi_view_split_priv_t *priv = NULL;
388         int valid = -1;
389
390         VCUI_RETURN_VALUE_IF_FAIL(vd , -1);
391         priv = (incall_multi_view_split_priv_t *) vd->priv;
392
393         valid = _vcui_check_valid_eo(priv->contents, VCUI_VIEW_MULTICALL_SPLIT_LAYOUT_ID);
394
395         return valid;
396 }
397
398 Evas_Object *_vcui_view_multi_call_split_get_layout(voice_call_view_data_t *vd)
399 {
400         CALL_UI_DEBUG("..");
401         incall_multi_view_split_priv_t *priv = NULL;
402
403         VCUI_RETURN_NULL_IF_FAIL(vd);
404         priv = (incall_multi_view_split_priv_t *) vd->priv;
405
406         VCUI_RETURN_NULL_IF_FAIL(priv);
407         return priv->contents;
408 }
409
410 Evas_Object *_vcui_view_multi_call_split_get_button_layout(voice_call_view_data_t *vd)
411 {
412         CALL_UI_DEBUG("..");
413         incall_multi_view_split_priv_t *priv = NULL;
414
415         VCUI_RETURN_NULL_IF_FAIL(vd);
416         priv = (incall_multi_view_split_priv_t *) vd->priv;
417
418         VCUI_RETURN_NULL_IF_FAIL(priv);
419         return priv->btn_ly;
420 }
421
422 void _vcui_view_multi_call_split_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur)
423 {
424         incall_multi_view_split_priv_t *priv = NULL;
425
426         VCUI_RETURN_IF_FAIL(vd);
427         priv = (incall_multi_view_split_priv_t *) vd->priv;
428
429         VCUI_RETURN_IF_FAIL(priv);
430         edje_object_part_text_set(_EDJ(priv->caller_info_unhold), "txt_timer", _(pcall_dur));
431 }
432
433 Evas_Object *_vc_ui_view_multi_call_split_get_caller_info_hold(voice_call_view_data_t *vd)
434 {
435         CALL_UI_DEBUG("..");
436         incall_multi_view_split_priv_t *priv = NULL;
437
438         VCUI_RETURN_NULL_IF_FAIL(vd);
439         priv = (incall_multi_view_split_priv_t *) vd->priv;
440
441         VCUI_RETURN_NULL_IF_FAIL(priv);
442         return priv->caller_info_hold;
443 }
444
445 Evas_Object *_vc_ui_view_multi_call_split_get_caller_info_unhold(voice_call_view_data_t *vd)
446 {
447         CALL_UI_DEBUG("..");
448         incall_multi_view_split_priv_t *priv = NULL;
449
450         VCUI_RETURN_NULL_IF_FAIL(vd);
451         priv = (incall_multi_view_split_priv_t *) vd->priv;
452
453         VCUI_RETURN_NULL_IF_FAIL(priv);
454         return priv->caller_info_unhold;
455 }
456
457