Make TIZEN 2.0
[apps/home/call.git] / ui / src / vcui-view-callend.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-common.h"
20 #include "vcui-view-callend.h"
21 #include "vcui-view-elements.h"
22
23 #define VCUI_VIEW_CALLEND_LAYOUT_ID "ENDCALLVIEW"
24 typedef struct {
25         Evas_Object *contents;
26         Evas_Object *caller_info;
27         Evas_Object *btn_ly;
28         Evas_Object *ic;        /* small size call image */
29         vcui_app_call_status_t call_status;
30 } endcall_view_priv_t;
31
32 static call_data_t *call_data = NULL;
33
34 static int __vcui_view_callend_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3);
35 static int __vcui_view_callend_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2);
36 static int __vcui_view_callend_onhide(voice_call_view_data_t *view_data);
37 static int __vcui_view_callend_onshow(voice_call_view_data_t *view_data);
38 static int __vcui_view_callend_ondestroy(voice_call_view_data_t *view_data);
39
40 static voice_call_view_data_t s_view = {
41         .type = VIEW_ENDCALL_VIEW,
42         .app_data = NULL,
43         .layout = NULL,
44         .onCreate = __vcui_view_callend_oncreate,
45         .onUpdate = __vcui_view_callend_onupdate,
46         .onHide = __vcui_view_callend_onhide,
47         .onShow = __vcui_view_callend_onshow,
48         .onDestroy = __vcui_view_callend_ondestroy,
49         .priv = NULL,
50 };
51
52 voice_call_view_data_t *_vcui_view_callend_new(vcui_app_call_data_t *ad)
53 {
54         s_view.app_data = ad;
55         s_view.priv = calloc(1, sizeof(endcall_view_priv_t));
56
57         if (!s_view.priv) {
58                 CALL_UI_DEBUG("ERROR!!!!!!!!!!!");
59         }
60
61         return &s_view;
62 }
63
64 static void __vcui_view_callend_draw_screen(Evas_Object *eo, void *data)
65 {
66         CALL_UI_DEBUG("..");
67
68         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
69         endcall_view_priv_t *priv = (endcall_view_priv_t *)vd->priv;
70         vcui_app_call_data_t *ad = vd->app_data;
71
72         /* ============ Check valid Evas Object ============= */
73         int valid = 0;
74         valid = _vcui_check_valid_eo(priv->contents, VCUI_VIEW_CALLEND_LAYOUT_ID);
75         if (valid == -1) {
76                 CALL_UI_DEBUG("[========== ENDCALLVIEW : Invalid Evas Object, priv->contents : %p ==========]", priv->contents);
77                 return;
78         }
79         /* ============ Check valid Evas Object ============= */
80
81         if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) {
82                 CALL_UI_DEBUG("CALL_END_TYPE_SINGLE_CALL type end screen");
83
84                 char *file_path = _vcui_doc_get_caller_id_file_path(call_data);
85                 char *call_number = _vcui_doc_get_call_number(call_data);
86                 char *call_name = _vcui_doc_get_call_display_name(call_data);
87
88                 /* call image */
89                 _vcui_delete_contact_image(priv->contents);
90                 if (strcmp(file_path, NOIMG_ICON) == 0) {
91                         _vcui_show_call_not_saved_bg_img(priv->contents);
92                       _vcui_show_default_image(priv->contents, vd->app_data->win_main, CALLER_ID_DEFAULT);
93                 } else {
94                         _vcui_show_call_bg_img(priv->contents);
95                         {
96                                 _vcui_show_wallpaper_image(priv->contents);
97                                 priv->ic = _vcui_show_contact_image(priv->contents, vd->app_data->win_main, file_path);
98                         }
99                 }
100
101                 _vcui_create_voicecall_button(vd, call_number);
102                 _vcui_create_videocall_button(vd, call_number);
103                 _vcui_create_message_button(vd, call_number);
104
105                 /* call name (if nothing, call number) */
106                 if (strlen(call_name) == 0) {
107                         _vcui_show_caller_info_name(vd, call_number, EINA_FALSE);
108                         _vcui_create_add_to_contacts_button(vd, call_number);
109                 } else {
110                         int ct_id = _vcui_doc_get_contact_index(call_data);
111                         _vcui_show_caller_info_name(vd, call_name, EINA_FALSE);
112                         _vcui_show_caller_info_number(vd, call_number, EINA_FALSE);
113                         _vcui_create_view_contact_button(vd, ct_id);
114                 }
115                 _vcui_view_common_set_each_time(_vcui_doc_get_call_start_time(call_data));
116         } else if (ad->call_end_type == CALL_END_TYPE_CONF_CALL) {
117                 CALL_UI_DEBUG("CALL_END_TYPE_CONF_CALL type end screen");
118                 char buf[DEF_BUF_LEN] = { 0, };
119
120                 /* Conference image */
121                 _vcui_show_wallpaper_image(priv->contents);
122                 priv->ic = _vcui_show_default_image(priv->contents, vd->app_data->win_main, CONF_ICON);
123                 if (priv->call_status == CALL_HOLD) {
124                         CALL_UI_DEBUG("ad->root_w: %d ad->root_h: %d", ad->root_w, ad->root_h);
125                         if (ad->root_w == MAIN_WIN_HD_W && ad->root_h == MAIN_WIN_HD_H) {
126                                 edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_HD", "CID_HD");
127                         } else if (ad->root_w == MAIN_WIN_WVGA_W && ad->root_h == MAIN_WIN_WVGA_H) {
128                                 edje_object_signal_emit(_EDJ(priv->contents), "SHOW_DIM_WVGA", "CID_WVGA");
129                         }
130                 } else {
131                         edje_object_signal_emit(_EDJ(priv->contents), "HIDE_DIM", "CID");
132                 }
133                 _vcui_show_caller_info_name(vd, _("IDS_CALL_OPT_CONFERENCE_CALL"), EINA_FALSE);
134                 snprintf(buf, DEF_BUF_LEN, "%d %s", (_vcui_doc_get_hold_call_data_count() + _vcui_doc_get_unhold_call_data_count()), _("IDS_CALL_BODY_PEOPLE"));
135                 _vcui_show_caller_info_number(vd, buf, EINA_FALSE);
136
137                 /*create a small button for Hold/Swap*/
138                 _vcui_create_hold_swap_button(vd);
139
140                 _vcui_create_top_left_button_disabled(vd);
141                 _vcui_create_top_middle_button_disabled(vd);
142                 _vcui_create_top_right_button_disabled(vd);
143                 _vcui_create_bottom_left_button_disabled(vd);
144                 _vcui_create_bottom_middle_button_disabled(vd);
145                 _vcui_create_bottom_right_button_disabled(vd);
146
147         } else {
148                 CALL_UI_DEBUG("invalid type... return");
149                 return;
150         }
151
152         evas_object_show(eo);
153 }
154
155 static Evas_Object *__vcui_view_callend_create_contents(void *data, char *grp_name)
156 {
157         if (data == NULL) {
158                 CALL_UI_DEBUG("ERROR");
159                 return NULL;
160         }
161         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
162         Evas_Object *eo = NULL;
163
164         eo = _vcui_load_edj(vd->app_data->win_main, EDJ_NAME, grp_name);
165
166         if (eo == NULL)
167                 return NULL;
168
169         return eo;
170 }
171
172 static Evas_Object *__vcui_view_callend_create_layout_main(Evas_Object *parent)
173 {
174         if (parent == NULL) {
175                 CALL_UI_DEBUG("ERROR");
176                 return NULL;
177         }
178
179         Evas_Object *ly;
180         ly = elm_layout_add(parent);
181         retvm_if(ly == NULL, NULL, "Failed elm_layout_add.");
182
183         elm_layout_theme_set(ly, "standard", "window", "integration");
184         evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
185         elm_win_resize_object_add(parent, ly);
186
187         edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm");
188         edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm");
189         evas_object_show(ly);
190
191         return ly;
192 }
193
194 static int __vcui_view_callend_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3)
195 {
196         CALL_UI_DEBUG("endcall view create");
197         voice_call_view_data_t *vd = view_data;
198         vcui_app_call_data_t *ad = vd->app_data;
199         endcall_view_priv_t *priv = (endcall_view_priv_t *)vd->priv;
200         Evas_Object *sep_ly = NULL;
201
202         CALL_UI_DEBUG("call_end_type[%d]", ad->call_end_type);
203         if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) {
204                 call_data = (call_data_t *)param2;
205         } else if (ad->call_end_type == CALL_END_TYPE_CONF_CALL) {
206                 priv->call_status = _vcui_doc_get_group_call_status();
207                 call_data = _vcui_doc_get_call_data_by_call_status(priv->call_status);
208         }
209
210         if (call_data == NULL) {
211                 CALL_UI_DEBUG("call Data is NULL");
212                 return VC_ERROR;
213         }
214
215         if (!vd->layout) {
216
217                 /* Create Main Layout */
218                 vd->layout = __vcui_view_callend_create_layout_main(vd->app_data->win_main);
219                 if (vd->layout == NULL) {
220                         CALL_UI_DEBUG("ERROR");
221                         return VC_ERROR;
222                 }
223
224                 /* Create Contents */
225                 if (ad->call_end_type == CALL_END_TYPE_SINGLE_CALL) {
226                         priv->contents = __vcui_view_callend_create_contents(vd, GRP_END_SINGLECALL);
227                         sep_ly = __vcui_view_callend_create_contents(vd, GRP_SEPARATOR_LAYOUT_3BUTTON);
228                         elm_object_part_content_set(priv->contents, "btn_bg", sep_ly);
229                 } else if (ad->call_end_type == CALL_END_TYPE_CONF_CALL) {
230                         priv->contents = __vcui_view_callend_create_contents(vd, GRP_END_CONFCALL);
231                         sep_ly = __vcui_view_callend_create_contents(vd, GRP_SEPARATOR_LAYOUT);
232                         elm_object_part_content_set(priv->contents, "btn_bg", sep_ly);
233                         priv->btn_ly = __vcui_view_callend_create_contents(vd, GRP_BUTTON_LAYOUT);
234                         elm_object_part_content_set(priv->contents, "btn_region", priv->btn_ly);
235                 }
236                 priv->caller_info = __vcui_view_callend_create_contents(vd, GRP_CALLER_INFO);
237                 elm_object_part_content_set(priv->contents, "caller_info", priv->caller_info);
238                 edje_object_signal_emit(_EDJ(priv->caller_info), "set-end-caller_ifno", "end-screen");
239
240                 elm_object_part_content_set(vd->layout, "elm.swallow.content", priv->contents);
241
242                 evas_object_name_set(priv->contents, VCUI_VIEW_CALLEND_LAYOUT_ID);
243                 CALL_UI_DEBUG("[========== ENDCALLVIEW: priv->contents Addr : [%p] ==========]", priv->contents);
244
245         } else {
246                 CALL_UI_DEBUG("[UI]ad->layout_end call==NULL case ");
247                 evas_object_show(vd->layout);
248         }
249
250         __vcui_view_callend_onshow(view_data);
251         return VC_NO_ERROR;
252 }
253
254 static int __vcui_view_callend_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2)
255 {
256         CALL_UI_DEBUG("end call view update");
257
258         __vcui_view_callend_onshow(view_data);
259
260         return VC_NO_ERROR;
261 }
262
263 static int __vcui_view_callend_onhide(voice_call_view_data_t *view_data)
264 {
265         CALL_UI_DEBUG("end call view hide");
266
267         evas_object_hide(view_data->layout);
268         return VC_NO_ERROR;
269 }
270
271 static int __vcui_view_callend_onshow(voice_call_view_data_t *view_data)
272 {
273         CALL_UI_DEBUG("end call view show");
274         CALL_UI_KPI("__vcui_view_callend_onshow start");
275         endcall_view_priv_t *priv = (endcall_view_priv_t *)view_data->priv;
276
277         /*change the orientation to normal - 0 */
278         elm_win_rotation_with_resize_set(view_data->app_data->win_main, 0);
279         elm_win_rotation_with_resize_set(view_data->app_data->popup_mw, 0);
280
281         __vcui_view_callend_draw_screen(priv->contents, view_data);
282
283         evas_object_hide(view_data->layout);
284         evas_object_show(view_data->layout);
285         return VC_NO_ERROR;
286 }
287
288 static int __vcui_view_callend_ondestroy(voice_call_view_data_t *view_data)
289 {
290         CALL_UI_DEBUG("endcall view destroy");
291
292         vcui_app_call_data_t *ad = _vcui_get_app_data();
293
294         voice_call_view_data_t *vd = ad->view_st[VIEW_ENDCALL_VIEW];
295         endcall_view_priv_t *priv = (endcall_view_priv_t *)vd->priv;
296
297         if (priv != NULL) {
298                 if (priv->contents) {
299                         evas_object_del(priv->contents);
300                         priv->contents = NULL;
301                 }
302
303                 if (priv->caller_info) {
304                         evas_object_del(priv->caller_info);
305                         priv->caller_info = NULL;
306                 }
307
308                 free(priv);
309                 priv = NULL;
310         }
311
312         if (vd->layout != NULL) {
313                 evas_object_hide(vd->layout);
314                 evas_object_del(vd->layout);
315                 vd->layout = NULL;
316         }
317
318         ad->view_st[VIEW_ENDCALL_VIEW] = NULL;
319         call_data = NULL;
320         ad->call_end_type = CALL_END_TYPE_NONE;
321
322         _vcui_cache_flush();
323         CALL_UI_DEBUG("complete destroy one view");
324         return VC_NO_ERROR;
325 }
326
327 int     _vc_ui_view_callend_check_valid_eo(voice_call_view_data_t *vd)
328 {
329         CALL_UI_DEBUG("..");
330
331         endcall_view_priv_t *priv = NULL;
332         int valid = -1;
333
334         VCUI_RETURN_VALUE_IF_FAIL(vd , -1);
335         priv = (endcall_view_priv_t *) vd->priv;
336
337         valid = _vcui_check_valid_eo(priv->contents, VCUI_VIEW_CALLEND_LAYOUT_ID);
338
339         return valid;
340 }
341
342 Evas_Object *_vc_ui_view_callend_get_layout(voice_call_view_data_t *vd)
343 {
344         CALL_UI_DEBUG("..");
345         endcall_view_priv_t *priv = NULL;
346
347         VCUI_RETURN_NULL_IF_FAIL(vd);
348         priv = (endcall_view_priv_t *) vd->priv;
349
350         VCUI_RETURN_NULL_IF_FAIL(priv);
351         return priv->contents;
352 }
353
354 Evas_Object *_vc_ui_view_callend_get_button_layout(voice_call_view_data_t *vd)
355 {
356         CALL_UI_DEBUG("..");
357         endcall_view_priv_t *priv = NULL;
358
359         VCUI_RETURN_NULL_IF_FAIL(vd);
360         priv = (endcall_view_priv_t *) vd->priv;
361
362         VCUI_RETURN_NULL_IF_FAIL(priv);
363         return priv->btn_ly;
364 }
365
366 void _vc_ui_view_callend_set_call_timer(voice_call_view_data_t *vd, char *pcall_dur)
367 {
368         endcall_view_priv_t *priv = NULL;
369
370         VCUI_RETURN_IF_FAIL(vd);
371         priv = (endcall_view_priv_t *) vd->priv;
372
373         VCUI_RETURN_IF_FAIL(priv);
374         edje_object_part_text_set(_EDJ(priv->caller_info), "txt_status", _(pcall_dur));
375 }
376
377 Evas_Object *_vc_ui_view_callend_get_caller_info(voice_call_view_data_t *vd)
378 {
379         CALL_UI_DEBUG("..");
380         endcall_view_priv_t *priv = NULL;
381
382         VCUI_RETURN_NULL_IF_FAIL(vd);
383         priv = (endcall_view_priv_t *) vd->priv;
384
385         VCUI_RETURN_NULL_IF_FAIL(priv);
386         return priv->caller_info;
387 }
388