apply FSL(Flora Software License)
[apps/home/call.git] / ui / 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 static int __vcui_view_multi_call_list_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3);
25 static int __vcui_view_multi_call_list_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2);
26 static int __vcui_view_multi_call_list_onhide(voice_call_view_data_t *view_data);
27 static int __vcui_view_multi_call_list_onshow(voice_call_view_data_t *view_data);
28 static int __vcui_view_multi_call_list_ondestroy(voice_call_view_data_t *view_data);
29
30 static voice_call_view_data_t s_view = {
31         .type = VIEW_INCALL_MULTICALL_LIST_VIEW,
32         .app_data = NULL,
33         .layout = NULL,
34         .onCreate = __vcui_view_multi_call_list_oncreate,
35         .onUpdate = __vcui_view_multi_call_list_onupdate,
36         .onHide = __vcui_view_multi_call_list_onhide,
37         .onShow = __vcui_view_multi_call_list_onshow,
38         .onDestroy = __vcui_view_multi_call_list_ondestroy,
39         .priv = NULL,
40 };
41
42 voice_call_view_data_t *_vcui_view_multi_call_list_new(vcui_app_call_data_t *ad)
43 {
44         s_view.app_data = ad;
45         s_view.priv = calloc(1, sizeof(vcui_view_multi_call_list_priv_t));
46
47         if (!s_view.priv) {
48                 CALL_UI_DEBUG("ERROR ");
49         }
50
51         return &s_view;
52 }
53
54 static void __vcui_view_multi_call_list_small_end_call_cb(void *data, Evas_Object *obj, void *event_info)
55 {
56         CALL_UI_DEBUG("..");
57         call_data_t *call_data = data;
58         _vcui_engine_end_call_by_handle(call_data->call_handle);
59         call_data->bno_end_show = EINA_TRUE;
60
61         _vcui_view_popup_load_endcall_time(call_data);
62 }
63
64 static void __vcui_view_multi_call_list_split_call_cb(void *data, Evas_Object *obj, void *event_info)
65 {
66         CALL_UI_DEBUG("..");
67         call_data_t *call_data = data;
68         _vcui_engine_split_call(call_data->call_handle);
69 }
70
71 static void __vcui_view_multi_call_list_gl_sel_call(void *data, Evas_Object *obj, void *event_info)
72 {
73         CALL_UI_DEBUG("..");
74
75         Elm_Object_Item *item = (Elm_Object_Item *)event_info;
76
77         elm_object_item_data_get(item);
78         elm_genlist_item_selected_set(item, 0);
79 }
80
81 static void __vcui_view_multi_call_list_gl_del_call(void *data, Evas_Object *obj)
82 {
83
84         return;
85 }
86
87 static Eina_Bool __vcui_view_multi_call_list_gl_state_get_call(void *data, Evas_Object *obj, const char *part)
88 {
89
90         return EINA_FALSE;
91 }
92
93 static Evas_Object *__vcui_view_multi_call_list_gl_content_get_call(void *data, Evas_Object *obj, const char *part)
94 {
95         call_data_t *call_data = (call_data_t *)data;
96
97         Evas_Object *icon = NULL;
98         Evas_Object *btn = NULL;
99
100         if (strcmp(part, "elm.swallow.end") == 0) {
101                 btn = elm_button_add(obj);
102                 elm_object_style_set(btn, "style_call_smallbtn_red");
103                 icon = elm_icon_add(obj);
104                 elm_icon_file_set(icon, CONF_CALL_END_ICON, NULL);
105                 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
106                 elm_icon_resizable_set(icon, 1, 1);
107                 elm_object_part_content_set(btn, "icon", icon);
108
109                 evas_object_smart_callback_add(btn, "clicked", __vcui_view_multi_call_list_small_end_call_cb, call_data);
110                 evas_object_propagate_events_set(btn, EINA_FALSE);
111
112                 return btn;
113         } else if (strcmp(part, "elm.swallow.private") == 0) {
114                 if (_vcui_doc_get_count_hold() > 0) {
115                         return NULL;
116                 }
117                 btn = elm_button_add(obj);
118                 icon = elm_icon_add(obj);
119                 elm_icon_file_set(icon, PRIVATE_ICON, NULL);
120                 elm_object_style_set(btn, "icon_only/style_call_icon_only_private");
121
122                 elm_icon_resizable_set(icon, 1, 1);
123                 elm_object_part_content_set(btn, "icon", icon);
124
125                 evas_object_smart_callback_add(btn, "clicked", __vcui_view_multi_call_list_split_call_cb, call_data);
126                 evas_object_propagate_events_set(btn, EINA_FALSE);
127
128                 return btn;
129         }
130
131         return NULL;
132 }
133
134 static char *__vcui_view_multi_call_list_gl_text_get_call(void *data, Evas_Object *obj, const char *part)
135 {
136         char buf[DEF_BUF_LEN] = { 0, };
137         call_data_t *call_data = (call_data_t *)data;
138
139         if (strcmp(part, "elm.text") == 0) {
140                 if (strlen((char *)call_data->call_display) == 0)
141                         snprintf(buf, sizeof(buf), "%s", call_data->call_num);
142                 else
143                         snprintf(buf, sizeof(buf), "%s", call_data->call_display);
144         }
145
146         return strdup(buf);
147 }
148
149 static void __vcui_view_multi_call_list_genlist_init(void *data)
150 {
151         itc_call->item_style = "multicall_list";
152         itc_call->func.text_get = __vcui_view_multi_call_list_gl_text_get_call;
153         itc_call->func.content_get = __vcui_view_multi_call_list_gl_content_get_call;
154         itc_call->func.state_get = __vcui_view_multi_call_list_gl_state_get_call;
155         itc_call->func.del = __vcui_view_multi_call_list_gl_del_call;
156 }
157
158 static void __vcui_view_multi_call_list_genlist_add(void *data)
159 {
160         voice_call_view_data_t *vd = data;
161         vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv;
162         Evas_Object *genlist = NULL;
163
164         genlist = elm_genlist_add(priv->contents);
165         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
166         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
167
168         elm_object_part_content_set(priv->contents, "swl_calllist", genlist);
169         priv->multibox_gl = genlist;
170 }
171
172 void __vcui_view_multi_call_list_genlist_item_append(void *data)
173 {
174         CALL_UI_DEBUG("..");
175         voice_call_view_data_t *vd = data;
176         vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv;
177         Eina_List *list = NULL;
178
179         if (priv->multibox_gl) {
180                 elm_genlist_clear(priv->multibox_gl);
181         }
182
183         if (priv->call_status == CALL_UNHOLD) {
184                 list = _vcui_doc_get_unhold_caller();
185         } else {
186                 list = _vcui_doc_get_hold_caller();
187         }
188         if (list == NULL) {
189                 CALL_UI_DEBUG("error");
190                 return;
191         }
192
193         Eina_List *l;
194         call_data_t *call_data;
195         EINA_LIST_FOREACH(list, l, call_data) {
196                 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);
197         }
198         eina_list_free(list);
199 }
200
201 static void __vcui_view_multi_call_list_back_cb(void *data, Evas_Object *obj, void *event_info)
202 {
203         CALL_UI_DEBUG("..");
204         _vcui_view_auto_change();
205 }
206
207 static void __vcui_view_multi_call_list_draw_screen(void *data)
208 {
209         CALL_UI_DEBUG("..");
210
211         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
212         vcui_app_call_data_t *ad = vd->app_data;
213         vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv;
214         call_data_t *call_data;
215
216         priv->total_members = _vcui_doc_get_count_hold()+_vcui_doc_get_count_unhold();
217         priv->call_status = _vcui_doc_get_show_callstatus();
218         call_data = _vcui_doc_get_last_status(priv->call_status);
219         if (call_data == NULL) {
220                 CALL_UI_DEBUG("call data is null");
221                 return;
222         }
223         _vcui_view_common_set_each_time(call_data->start_time);
224
225                 _vcui_show_wallpaper_image(priv->contents);
226
227                 __vcui_view_multi_call_list_genlist_item_append(vd);
228
229                 _vcui_create_conf_list_button_hold(vd);
230                 _vcui_create_button_bigend(vd);
231         evas_object_show(priv->contents);
232 }
233
234 static Evas_Object *__vcui_view_multi_call_list_create_contents(void *data, char *group)
235 {
236         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
237         Evas_Object *eo;
238
239         if (data == NULL) {
240                 CALL_UI_DEBUG("ERROR");
241                 return NULL;
242         }
243
244         /* load edje */
245         eo = _vcui_load_edj(vd->layout, EDJ_NAME, group);
246         if (eo == NULL)
247                 return NULL;
248
249         return eo;
250 }
251
252 static void __vcui_view_multi_call_list_create_navigationframe_layout(voice_call_view_data_t *vd)
253 {
254         Evas_Object *navi_ly;
255         Evas_Object *btn1;
256         vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv;
257
258         navi_ly = _vcui_load_edj(priv->navi_frame, EDJ_NAME, "navigation_view");
259         if (navi_ly == NULL)
260                 return;
261         CALL_UI_DEBUG("navi_layout created...");
262
263         /* Load default button */
264         btn1 = elm_button_add(priv->navi_frame);
265         elm_object_style_set(btn1, "vcui_naviframe_new_backbutton/default");
266         evas_object_smart_callback_add(btn1, "clicked", __vcui_view_multi_call_list_back_cb, vd);
267
268         elm_naviframe_item_push(priv->navi_frame, _("IDS_CALL_OPT_CONFERENCE_CALL"), btn1, NULL, navi_ly, "vcui_naviframe_new_item_1line");
269 }
270
271 static Evas_Object *__vcui_view_multi_call_list_create_navigation_layout(Evas_Object *parent)
272 {
273         Evas_Object *navi_frame;
274
275         if (parent == NULL) {
276                 CALL_UI_DEBUG("ERROR");
277                 return NULL;
278         }
279
280         navi_frame = elm_naviframe_add(parent);
281         elm_object_style_set(navi_frame, "vcui_naviframe_new/default");
282
283         return navi_frame;
284 }
285
286 static Evas_Object *__vcui_view_multi_call_list_create_layout_main(Evas_Object *parent)
287 {
288         if (parent == NULL) {
289                 CALL_UI_DEBUG("ERROR");
290                 return NULL;
291         }
292
293         Evas_Object *ly;
294         ly = elm_layout_add(parent);
295         retvm_if(ly == NULL, NULL, "Failed elm_layout_add.");
296
297         elm_layout_theme_set(ly, "standard", "window", "integration");
298         evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
299         elm_win_resize_object_add(parent, ly);
300
301         edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm");
302         edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm");
303         evas_object_show(ly);
304
305         return ly;
306 }
307
308 static int __vcui_view_multi_call_list_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3)
309 {
310         CALL_UI_DEBUG("multicall-list view create");
311
312         voice_call_view_data_t *vd = view_data;
313         vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv;
314
315         itc_call = elm_genlist_item_class_new();
316
317         if (!vd->layout) {
318                 vd->layout = __vcui_view_multi_call_list_create_layout_main(vd->app_data->win_main);
319                 if (vd->layout == NULL) {
320                         CALL_UI_DEBUG("ERROR");
321                         return VC_ERROR;
322                 }
323                 priv->contents = __vcui_view_multi_call_list_create_contents(vd, GRP_MULTICALL);
324                 elm_object_part_content_set(vd->layout, "elm.swallow.content", priv->contents);
325
326                 priv->navi_frame = __vcui_view_multi_call_list_create_navigation_layout(vd->layout);
327                 elm_object_part_content_set(priv->contents, "navigation_bar", priv->navi_frame);
328
329                 __vcui_view_multi_call_list_create_navigationframe_layout(vd);
330
331                 evas_object_name_set(priv->contents, "MULTIVIEWLIST");
332                 CALL_UI_DEBUG("[========== MULTIVIEWLIST: priv->contents Addr : [%p] ==========]", priv->contents);
333
334                 __vcui_view_multi_call_list_genlist_add(vd);
335                 __vcui_view_multi_call_list_genlist_init(vd);
336         } else {
337                 CALL_UI_DEBUG("[UI]ad->layout_multicall != NULL case ");
338                 evas_object_show(vd->layout);
339         }
340
341         __vcui_view_multi_call_list_onshow(view_data);
342
343         return VC_NO_ERROR;
344 }
345
346 static int __vcui_view_multi_call_list_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2)
347 {
348         CALL_UI_DEBUG("multicall-list view update");
349
350         __vcui_view_multi_call_list_onshow(view_data);
351         return VC_NO_ERROR;
352 }
353
354 static int __vcui_view_multi_call_list_onhide(voice_call_view_data_t *view_data)
355 {
356         CALL_UI_DEBUG("multicall-list view hide");
357
358         evas_object_hide(view_data->layout);
359         return VC_NO_ERROR;
360 }
361
362 static int __vcui_view_multi_call_list_onshow(voice_call_view_data_t *view_data)
363 {
364         CALL_UI_DEBUG("multicall-list view show");
365
366         __vcui_view_multi_call_list_draw_screen(view_data);
367
368         evas_object_hide(view_data->layout);
369         evas_object_show(view_data->layout);
370         return VC_NO_ERROR;
371 }
372
373 static int __vcui_view_multi_call_list_ondestroy(voice_call_view_data_t *view_data)
374 {
375         CALL_UI_DEBUG("multicall-list view destroy");
376
377         vcui_app_call_data_t *ad = _vcui_get_app_data();
378
379         voice_call_view_data_t *vd = ad->view_st[VIEW_INCALL_MULTICALL_LIST_VIEW];
380         vcui_view_multi_call_list_priv_t *priv = (vcui_view_multi_call_list_priv_t *)vd->priv;
381
382         if (itc_call)
383                 elm_genlist_item_class_free(itc_call);
384
385         if (priv != NULL) {
386                 if (priv->multibox_gl != NULL) {
387                         elm_genlist_clear(priv->multibox_gl);
388                         evas_object_del(priv->multibox_gl);
389                         priv->multibox_gl = NULL;
390                 }
391
392                 if (priv->contents) {
393                         evas_object_del(priv->contents);
394                         priv->contents = NULL;
395                 }
396
397                 free(priv);
398                 priv = NULL;
399         }
400
401         if (vd->layout != NULL) {
402                 evas_object_hide(vd->layout);
403                 evas_object_del(vd->layout);
404                 vd->layout = NULL;
405         }
406
407         ad->view_st[VIEW_INCALL_MULTICALL_LIST_VIEW] = NULL;
408
409         _vcui_cache_flush();
410         CALL_UI_DEBUG("complete destroy multi view list");
411         return VC_NO_ERROR;
412 }