apply FSL(Flora Software License)
[apps/home/call.git] / ui / src / vcui-view-multi-call-list.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-elements.h"
20 #include "vcui-view-multi-call-list.h"
21
22 static Elm_Genlist_Item_Class *itc_call;
23
24 #define VCUI_VIEW_MULTICALL_LIST_LAYOUT_ID "MULTIVIEWLIST"
25 typedef struct {
26         Evas_Object *nf;
27         Evas_Object *contents;
28         Evas_Object *cid_ly;
29         Evas_Object *ic;
30         Evas_Object *record_btn;
31         vcui_app_call_status_t call_status;
32         Evas_Object *multibox_gl;
33         int     total_members;
34 } vcui_view_multi_call_list_priv_t;
35
36 static int __vcui_view_multi_call_list_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3);
37 static int __vcui_view_multi_call_list_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2);
38 static int __vcui_view_multi_call_list_onhide(voice_call_view_data_t *view_data);
39 static int __vcui_view_multi_call_list_onshow(voice_call_view_data_t *view_data);
40 static int __vcui_view_multi_call_list_ondestroy(voice_call_view_data_t *view_data);
41
42 static voice_call_view_data_t s_view = {
43         .type = VIEW_INCALL_MULTICALL_LIST_VIEW,
44         .app_data = NULL,
45         .layout = NULL,
46         .onCreate = __vcui_view_multi_call_list_oncreate,
47         .onUpdate = __vcui_view_multi_call_list_onupdate,
48         .onHide = __vcui_view_multi_call_list_onhide,
49         .onShow = __vcui_view_multi_call_list_onshow,
50         .onDestroy = __vcui_view_multi_call_list_ondestroy,
51         .priv = NULL,
52 };
53
54 voice_call_view_data_t *_vcui_view_multi_call_list_new(vcui_app_call_data_t *ad)
55 {
56         s_view.app_data = ad;
57         s_view.priv = calloc(1, sizeof(vcui_view_multi_call_list_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_list_small_end_call_cb(void *data, Evas_Object *obj, void *event_info)
67 {
68         CALL_UI_DEBUG("..");
69         vcui_app_call_data_t *ad = _vcui_get_app_data();
70         call_data_t *call_data = data;
71         int handle = _vcui_doc_get_call_handle(call_data);
72         vcall_engine_release_call_by_handle(handle);
73         ad->call_end_type = CALL_END_TYPE_NONE;
74
75         _vcui_view_popup_load_endcall_time(call_data);
76 }
77
78 static void __vcui_view_multi_call_list_split_call_cb(void *data, Evas_Object *obj, void *event_info)
79 {
80         CALL_UI_DEBUG("..");
81         call_data_t *call_data = data;
82         int handle = _vcui_doc_get_call_handle(call_data);
83         vcall_engine_split_call(handle);
84 }
85
86 static void __vcui_view_multi_call_list_gl_sel_call(void *data, Evas_Object *obj, void *event_info)
87 {
88         CALL_UI_DEBUG("..");
89
90         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
91
92         elm_object_item_data_get(item);
93         elm_genlist_item_selected_set(item, 0);
94 }
95
96 static void __vcui_view_multi_call_list_gl_del_call(void *data, Evas_Object *obj)
97 {
98
99         return;
100 }
101
102 static Eina_Bool __vcui_view_multi_call_list_gl_state_get_call(void *data, Evas_Object *obj, const char *part)
103 {
104
105         return EINA_FALSE;
106 }
107
108 static Evas_Object *__vcui_view_multi_call_list_gl_icon_get_call(void *data, Evas_Object *obj, const char *part)
109 {
110         call_data_t *call_data = (call_data_t *)data;
111
112         Evas_Object *icon = NULL;
113         Evas_Object *btn = NULL;
114
115         if (strcmp(part, "elm.swallow.end") == 0) {
116                 btn = elm_button_add(obj);
117                 elm_object_style_set(btn, "style_call_icon_only_end");
118                 icon = elm_image_add(obj);
119                 elm_image_file_set(icon, CONF_CALL_END_ICON, NULL);
120                 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
121                 elm_image_resizable_set(icon, 1, 1);
122                 elm_object_content_set(btn, icon);
123
124                 evas_object_smart_callback_add(btn, "clicked", __vcui_view_multi_call_list_small_end_call_cb, call_data);
125                 evas_object_propagate_events_set(btn, EINA_FALSE);
126
127                 return btn;
128         } else if (strcmp(part, "elm.swallow.private") == 0) {
129                 if (_vcui_doc_get_hold_call_data_count() > 0) {
130                         return NULL;
131                 }
132                 btn = elm_button_add(obj);
133                 icon = elm_image_add(obj);
134                 elm_image_file_set(icon, PRIVATE_ICON, NULL);
135                 elm_object_style_set(btn, "style_call_icon_only_private");
136
137                 elm_image_resizable_set(icon, 1, 1);
138                 elm_object_content_set(btn, icon);
139
140                 evas_object_smart_callback_add(btn, "clicked", __vcui_view_multi_call_list_split_call_cb, call_data);
141                 evas_object_propagate_events_set(btn, EINA_FALSE);
142
143                 return btn;
144         }
145
146         return NULL;
147 }
148
149 static char *__vcui_view_multi_call_list_gl_label_get_call(void *data, Evas_Object *obj, const char *part)
150 {
151         char buf[DEF_BUF_LEN] = { 0, };
152         call_data_t *call_data = (call_data_t *)data;
153         char *call_number = _vcui_doc_get_call_number(call_data);
154         char *call_name = _vcui_doc_get_call_display_name(call_data);
155
156         if (strcmp(part, "elm.text") == 0) {
157                 if (strlen(call_name) == 0) {
158                         snprintf(buf, sizeof(buf), "%s", call_number);
159                 } else {
160                         snprintf(buf, sizeof(buf), "%s", call_name);
161                 }
162         }
163
164         return strdup(buf);
165 }
166
167 static void __vcui_view_multi_call_list_genlist_init(void *data)
168 {
169         itc_call = elm_genlist_item_class_new();
170
171         itc_call->item_style = "multicall_list";
172         itc_call->func.text_get = __vcui_view_multi_call_list_gl_label_get_call;
173         itc_call->func.content_get = __vcui_view_multi_call_list_gl_icon_get_call;
174         itc_call->func.state_get = __vcui_view_multi_call_list_gl_state_get_call;
175         itc_call->func.del = __vcui_view_multi_call_list_gl_del_call;
176 }
177
178 static void __vcui_view_multi_call_list_genlist_add(void *data)
179 {
180         voice_call_view_data_t *vd = data;
181         vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv;
182         Evas_Object *genlist = NULL;
183
184         genlist = elm_genlist_add(priv->contents);
185         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
186         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
187
188         elm_object_part_content_set(priv->contents, "swl_calllist", genlist);
189         priv->multibox_gl = genlist;
190 }
191
192 void __vcui_view_multi_call_list_genlist_item_append(void *data)
193 {
194         CALL_UI_DEBUG("..");
195         voice_call_view_data_t *vd = data;
196         vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv;
197         Eina_List *list = NULL;
198
199         if (priv->multibox_gl) {
200                 elm_genlist_clear(priv->multibox_gl);
201         }
202
203         if (priv->call_status == CALL_UNHOLD) {
204                 list = _vcui_doc_get_caller_list_with_unhold_status();
205         } else {
206                 list = _vcui_doc_get_caller_list_with_hold_status();
207         }
208         if (list == NULL) {
209                 CALL_UI_DEBUG("error");
210                 return;
211         }
212
213         Eina_List *l = NULL;
214         call_data_t *call_data = NULL;
215         EINA_LIST_FOREACH(list, l, call_data) {
216                 elm_genlist_item_append(priv->multibox_gl, itc_call, (void *)call_data, NULL, ELM_GENLIST_ITEM_NONE, __vcui_view_multi_call_list_gl_sel_call, data);
217         }
218         eina_list_free(list);
219 }
220
221 static void __vcui_view_multi_call_list_back_cb(void *data, Evas_Object *obj, void *event_info)
222 {
223         CALL_UI_DEBUG("..");
224         _vcui_view_auto_change();
225 }
226
227 static void __vcui_view_multi_call_list_draw_screen(void *data)
228 {
229         CALL_UI_DEBUG("..");
230
231         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
232         vcui_app_call_data_t *ad = vd->app_data;
233         vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv;
234         call_data_t *call_data = NULL;
235
236         priv->total_members = _vcui_doc_get_hold_call_data_count() + _vcui_doc_get_unhold_call_data_count();
237         priv->call_status = _vcui_doc_get_group_call_status();
238         call_data = _vcui_doc_get_call_data_by_call_status(priv->call_status);
239         if (call_data == NULL) {
240                 CALL_UI_DEBUG("call data is null");
241                 return;
242         }
243         _vcui_view_common_set_each_time(_vcui_doc_get_call_start_time(call_data));
244
245         elm_win_rotation_with_resize_set(ad->win_main, ad->rotate_angle);
246         elm_win_rotation_with_resize_set(ad->popup_mw, ad->rotate_angle);
247
248         if (ad->rotate_angle == 0 || ad->rotate_angle == 180) {
249                 CALL_UI_DEBUG("create portrait mode layout items");
250
251                 __vcui_view_multi_call_list_genlist_item_append(vd);
252
253                 _vcui_create_conf_list_button_hold(vd);
254                 _vcui_create_button_bigend(vd);
255         } else if (ad->rotate_angle == 90 || ad->rotate_angle == 270) {
256                 CALL_UI_DEBUG("landscape mode not supported");
257         }
258         evas_object_show(priv->contents);
259 }
260
261 static Evas_Object *__vcui_view_multi_call_list_create_naviframe(Evas_Object *parent)
262 {
263         if (parent == NULL) {
264                 CALL_UI_DEBUG("ERROR");
265                 return NULL;
266         }
267
268         Evas_Object *nf = elm_naviframe_add(parent);
269         retvm_if(nf == NULL, NULL, "Failed elm_naviframe_add.");
270
271         elm_object_part_content_set(parent, "elm.swallow.content", nf);
272         evas_object_show(nf);
273
274         return nf;
275 }
276
277 static Evas_Object *__vcui_view_multi_call_list_create_contents(Evas_Object *parent, char *group)
278 {
279         Evas_Object *eo;
280
281         if (parent == NULL) {
282                 CALL_UI_DEBUG("ERROR");
283                 return NULL;
284         }
285
286         /* load edje */
287         eo = _vcui_load_edj(parent, EDJ_NAME, group);
288         if (eo == NULL)
289                 return NULL;
290
291         return eo;
292 }
293
294 static Evas_Object *__vcui_view_multi_call_list_create_layout_main(Evas_Object *parent)
295 {
296         if (parent == NULL) {
297                 CALL_UI_DEBUG("ERROR");
298                 return NULL;
299         }
300
301         Evas_Object *ly;
302         ly = elm_layout_add(parent);
303         retvm_if(ly == NULL, NULL, "Failed elm_layout_add.");
304
305         elm_layout_theme_set(ly, "layout", "application", "default");
306         evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
307         elm_win_resize_object_add(parent, ly);
308
309         elm_win_indicator_mode_set(ly, ELM_WIN_INDICATOR_SHOW);
310         evas_object_show(ly);
311
312         return ly;
313 }
314
315 static int __vcui_view_multi_call_list_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3)
316 {
317         CALL_UI_DEBUG("multicall-list view create");
318
319         voice_call_view_data_t *vd = view_data;
320
321         if (!vd->layout) {
322                 vd->layout = __vcui_view_multi_call_list_create_layout_main(vd->app_data->win_main);
323                 if (vd->layout == NULL) {
324                         CALL_UI_DEBUG("ERROR");
325                         return VC_ERROR;
326                 }
327         } else {
328                 CALL_UI_DEBUG("[UI]ad->layout_multicall != NULL case ");
329                 evas_object_show(vd->layout);
330         }
331
332         __vcui_view_multi_call_list_onshow(view_data);
333
334         return VC_NO_ERROR;
335 }
336
337 static int __vcui_view_multi_call_list_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2)
338 {
339         CALL_UI_DEBUG("multicall-list view update");
340
341         __vcui_view_multi_call_list_onshow(view_data);
342         return VC_NO_ERROR;
343 }
344
345 static int __vcui_view_multi_call_list_onhide(voice_call_view_data_t *view_data)
346 {
347         CALL_UI_DEBUG("multicall-list view hide");
348
349         evas_object_hide(view_data->layout);
350         return VC_NO_ERROR;
351 }
352
353 static int __vcui_view_multi_call_list_onshow(voice_call_view_data_t *view_data)
354 {
355         CALL_UI_DEBUG("multicall-list view show");
356
357         vcui_app_call_data_t *ad = view_data->app_data;
358         vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)view_data->priv;
359         Evas_Object *back_btn = NULL;
360         Elm_Object_Item *item = NULL;
361
362         if (priv->cid_ly) {
363                 CALL_UI_DEBUG("..");
364                 evas_object_del(priv->cid_ly);
365                 priv->cid_ly = NULL;
366         }
367
368         if (priv->contents) {
369                 evas_object_del(priv->contents);
370                 priv->contents = NULL;
371         }
372
373         if (priv->nf) {
374                 evas_object_del(priv->nf);
375                 priv->nf = NULL;
376         }
377
378         /* Create naviframe layout */
379         priv->nf = __vcui_view_multi_call_list_create_naviframe(view_data->layout);
380
381         if (ad->rotate_angle == 0 || ad->rotate_angle == 180) {
382                 CALL_UI_DEBUG("portrait mode layout");
383                 priv->contents = __vcui_view_multi_call_list_create_contents(priv->nf, GRP_MULTICALL);
384
385                 __vcui_view_multi_call_list_genlist_add(view_data);
386                 __vcui_view_multi_call_list_genlist_init(view_data);
387
388         } else if (ad->rotate_angle == 90 || ad->rotate_angle == 270) {
389                 CALL_UI_DEBUG("landscape mode not supported");
390         }
391
392         back_btn = elm_button_add(priv->nf);
393         elm_object_style_set(back_btn, "naviframe/end_btn/default");
394         evas_object_smart_callback_add(back_btn, "clicked", __vcui_view_multi_call_list_back_cb, view_data);
395
396         item = elm_naviframe_item_push(priv->nf,  _("IDS_CALL_OPT_CONFERENCE_CALL"), back_btn, NULL, priv->contents, NULL);
397
398         evas_object_name_set(priv->contents, VCUI_VIEW_MULTICALL_LIST_LAYOUT_ID);
399         CALL_UI_DEBUG("[========== MULTIVIEWLIST: priv->contents Addr : [%p] ==========]", priv->contents);
400
401         __vcui_view_multi_call_list_draw_screen(view_data);
402
403         evas_object_hide(view_data->layout);
404         evas_object_show(view_data->layout);
405         return VC_NO_ERROR;
406 }
407
408 static int __vcui_view_multi_call_list_ondestroy(voice_call_view_data_t *view_data)
409 {
410         CALL_UI_DEBUG("multicall-list view destroy");
411
412         vcui_app_call_data_t *ad = _vcui_get_app_data();
413
414         voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_MULTICALL_LIST_VIEW];
415         vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv;
416
417         if (itc_call)
418                 elm_genlist_item_class_free(itc_call);
419
420         if (priv != NULL) {
421                 if (priv->multibox_gl != NULL) {
422                         elm_genlist_clear(priv->multibox_gl);
423                         evas_object_del(priv->multibox_gl);
424                         priv->multibox_gl = NULL;
425                 }
426                 if (priv->cid_ly) {
427                         CALL_UI_DEBUG("..");
428                         evas_object_del(priv->cid_ly);
429                         priv->cid_ly = NULL;
430                 }
431
432                 if (priv->contents) {
433                         evas_object_del(priv->contents);
434                         priv->contents = NULL;
435                 }
436
437                 if (priv->nf) {
438                         evas_object_del(priv->nf);
439                         priv->nf = NULL;
440                 }
441
442                 free(priv);
443                 priv = NULL;
444         }
445
446         if (vd->layout != NULL) {
447                 evas_object_hide(vd->layout);
448                 evas_object_del(vd->layout);
449                 vd->layout = NULL;
450         }
451
452         ad->view_st[VIEW_INCALL_MULTICALL_LIST_VIEW] = NULL;
453
454         _vcui_cache_flush();
455         CALL_UI_DEBUG("complete destroy multi view list");
456         return VC_NO_ERROR;
457 }
458
459 int     _vcui_view_multi_call_list_check_valid_eo(voice_call_view_data_t *vd)
460 {
461         CALL_UI_DEBUG("..");
462
463         vcui_view_multi_call_list_priv_t *priv = NULL;
464         int valid = -1;
465
466         VCUI_RETURN_VALUE_IF_FAIL(vd , -1);
467         priv = (vcui_view_multi_call_list_priv_t *) vd->priv;
468
469         valid = _vcui_check_valid_eo(priv->contents, VCUI_VIEW_MULTICALL_LIST_LAYOUT_ID);
470
471         return valid;
472 }
473
474 Evas_Object *_vcui_view_multi_call_list_get_main_layout(voice_call_view_data_t *vd)
475 {
476         CALL_UI_DEBUG("..");
477         vcui_view_multi_call_list_priv_t *priv = NULL;
478
479         VCUI_RETURN_NULL_IF_FAIL(vd);
480         priv = (vcui_view_multi_call_list_priv_t *) vd->priv;
481
482         VCUI_RETURN_NULL_IF_FAIL(priv);
483         return priv->contents;
484 }
485
486 int     _vcui_view_multi_call_list_get_call_status(voice_call_view_data_t *vd)
487 {
488         CALL_UI_DEBUG("..");
489         vcui_view_multi_call_list_priv_t *priv = NULL;
490         int call_status = 0;
491
492         VCUI_RETURN_INVALID_IF_FAIL(vd);
493         priv = (vcui_view_multi_call_list_priv_t *) vd->priv;
494
495         VCUI_RETURN_INVALID_IF_FAIL(priv);
496         if (priv->call_status == CALL_HOLD) {
497                 call_status = CALL_HOLD;
498         } else {
499                 call_status = CALL_UNHOLD;
500         }
501
502         return call_status;
503 }
504
505 void _vcui_view_multi_call_list_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur)
506 {
507         vcui_view_multi_call_list_priv_t *priv = NULL;
508
509         VCUI_RETURN_IF_FAIL(vd);
510         priv = (vcui_view_multi_call_list_priv_t *) vd->priv;
511
512         VCUI_RETURN_IF_FAIL(priv);
513         edje_object_part_text_set(_EDJ(priv->contents), "txt_timer", _(pcall_dur));
514 }
515
516 Evas_Object *_vcui_view_multi_call_list_get_cid_layout(voice_call_view_data_t *vd)
517 {
518         CALL_UI_DEBUG("..");
519         vcui_view_multi_call_list_priv_t *priv = NULL;
520
521         VCUI_RETURN_NULL_IF_FAIL(vd);
522         priv = (vcui_view_multi_call_list_priv_t *) vd->priv;
523
524         VCUI_RETURN_NULL_IF_FAIL(priv);
525         return priv->cid_ly;
526 }
527
528 int     _vcui_view_multi_call_list_get_total_members(voice_call_view_data_t *vd)
529 {
530         CALL_UI_DEBUG("..");
531         vcui_view_multi_call_list_priv_t *priv = NULL;
532
533         VCUI_RETURN_INVALID_IF_FAIL(vd);
534         priv = (vcui_view_multi_call_list_priv_t *) vd->priv;
535
536         VCUI_RETURN_INVALID_IF_FAIL(priv);
537
538         return priv->total_members;
539 }
540
541