Make TIZEN 2.0
[apps/home/call.git] / ui / src / vcui-view-quickpanel.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-quickpanel.h"
21 #include <minicontrol-provider.h>
22
23 #define VIEW_QUICKPANEL_LAYOUT_ID "QUICKPANELVIEW"
24 typedef struct {
25         Evas_Object *caller_id;
26         int rotate_angle;
27         Ecore_Event_Handler *client_msg_handler;
28 } vcui_view_qp_priv_t;
29
30 static int __vcui_view_qp_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3);
31 static int __vcui_view_qp_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2);
32 static int __vcui_view_qp_onhide(voice_call_view_data_t *view_data);
33 static int __vcui_view_qp_onshow(voice_call_view_data_t *view_data);
34 static int __vcui_view_qp_ondestroy(voice_call_view_data_t *view_data);
35 static void __vcui_view_qp_caller_id_cb(void *data, Evas_Object *obj, void *event_info);
36 static Eina_Bool __vcui_qp_client_message_cb(void *data, int type, void *event);
37
38 static voice_call_view_data_t s_view = {
39         .type = VIEW_QUICKPANEL_VIEW,
40         .app_data = NULL,
41         .layout = NULL,
42         .onCreate = __vcui_view_qp_oncreate,
43         .onUpdate = __vcui_view_qp_onupdate,
44         .onHide = __vcui_view_qp_onhide,
45         .onShow = __vcui_view_qp_onshow,
46         .onDestroy = __vcui_view_qp_ondestroy,
47         .priv = NULL,
48 };
49
50 static Eina_Bool __vcui_qp_client_message_cb(void *data, int type, void *event)
51 {
52         CALL_UI_DEBUG("..");
53         int new_angle = 0;
54         Ecore_X_Event_Client_Message *ev = (Ecore_X_Event_Client_Message *) event;
55         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
56         vcui_app_call_data_t *ad = vd->app_data;
57         vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)vd->priv;
58
59         CALL_UI_DEBUG("message_type: %d", ev->message_type);
60         if ((ev->message_type == ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE)
61                 || (ev->message_type == ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE)) {
62                 new_angle = ev->data.l[0];
63                 CALL_UI_DEBUG("ROTATION: %d", new_angle);
64                 priv->rotate_angle = new_angle;
65                 elm_win_rotation_with_resize_set(ad->win_quickpanel, new_angle);
66                 __vcui_view_qp_onshow(vd);
67         }
68
69         return ECORE_CALLBACK_RENEW;
70 }
71
72 static void __vcui_view_qp_caller_id_cb(void *data, Evas_Object *obj, void *event_info)
73 {
74         CALL_UI_DEBUG("..");
75         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
76         vcui_app_call_data_t *ad = vd->app_data;
77
78         elm_win_raise(ad->win_main);
79 }
80
81 voice_call_view_data_t *_vcui_view_qp_new(vcui_app_call_data_t *ad)
82 {
83         s_view.app_data = ad;
84         s_view.priv = calloc(1, sizeof(vcui_view_qp_priv_t));
85
86         if (!s_view.priv) {
87                 CALL_UI_DEBUG("ERROR!!!!!!!!!!! ");
88         }
89
90         return &s_view;
91 }
92
93 static void __vcui_view_qp_draw_contact_image(Evas_Object *eo, call_data_t *pcall_data)
94 {
95         CALL_UI_DEBUG("..");
96         vcui_app_call_data_t *ad = _vcui_get_app_data();
97         voice_call_view_data_t *vd = ad->view_st[VIEW_QUICKPANEL_VIEW];
98
99         vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)vd->priv;
100
101         if (pcall_data == NULL)
102                 return;
103
104         _vcui_delete_contact_image(eo);
105         char *file_path = _vcui_doc_get_caller_id_file_path(pcall_data);
106         if (strcmp(file_path, NOIMG_ICON) == 0) {
107                 priv->caller_id = _vcui_show_default_image(eo, ad->win_quickpanel, QP_NOIMG_ICON);
108         } else {
109                 priv->caller_id = _vcui_show_default_image(eo, ad->win_quickpanel, file_path);
110         }
111 }
112
113 static void __vcui_view_qp_update_caller(Evas_Object *eo, call_data_t *pcall_data)
114 {
115         CALL_UI_DEBUG("..");
116
117         if (pcall_data == NULL)
118                 return;
119
120         char *call_number = _vcui_doc_get_call_number(pcall_data);
121         char *call_name = _vcui_doc_get_call_display_name(pcall_data);
122         if (strlen(call_name) == 0) {
123                 edje_object_part_text_set(_EDJ(eo), "txt_call_name", call_number);
124         } else {
125                 edje_object_part_text_set(_EDJ(eo), "txt_call_name", call_name);
126         }
127 }
128
129 static void __vcui_view_qp_draw_screen(Evas_Object *eo, void *data)
130 {
131         CALL_UI_DEBUG("..");
132         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
133         vcui_app_call_data_t *ad = vd->app_data;
134         vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)vd->priv;
135         call_data_t *call_data = NULL;
136         char buf[DEF_BUF_LEN] = {0, };
137
138         int grp_count = 0;
139
140         vcall_engine_get_group_count(&grp_count);
141         CALL_UI_DEBUG("No. of groups - %d", grp_count);
142         if (grp_count > 1) {
143                 CALL_UI_DEBUG("multi-party call - show active call");
144                 int active_calls = 0;
145
146                 active_calls = _vcui_doc_get_unhold_call_data_count();
147                 CALL_UI_DEBUG("active_calls[%d]", active_calls);
148                 if (active_calls > 1) {
149                         char *temp = _("IDS_QP_BODY_GROUP_CALL_HPD_ABB");
150                         call_data = _vcui_doc_get_first_call_data_by_unhold_status();
151                         snprintf(buf, DEF_BUF_LEN, temp, active_calls);
152                         edje_object_part_text_set(_EDJ(eo), "txt_call_name", buf);
153                         priv->caller_id = _vcui_show_default_image(eo, ad->win_quickpanel, QP_CONF_ICON);
154                 } else if (active_calls == 1) {
155                         call_data = _vcui_doc_get_first_call_data_by_unhold_status();
156                         __vcui_view_qp_update_caller(eo, call_data);
157                         __vcui_view_qp_draw_contact_image(eo, call_data);
158                 } else {
159                         CALL_UI_DEBUG("invalid case");
160                 }
161                 _vcui_create_quickpanel_mute_button(vd);
162                 _vcui_create_quickpanel_end_button(vd);
163         } else if (grp_count == 1) {
164                 CALL_UI_DEBUG("single-party call");
165                 int all_calls = 0;
166
167                 all_calls = _vcui_doc_get_all_call_data_count();
168                 CALL_UI_DEBUG("all_calls[%d]", all_calls);
169
170                 if (all_calls > 1) {
171                         char *temp = _("IDS_QP_BODY_GROUP_CALL_HPD_ABB");
172                         call_data = _vcui_doc_get_first_call_data_from_list();
173                         snprintf(buf, DEF_BUF_LEN, temp, all_calls);
174                         edje_object_part_text_set(_EDJ(eo), "txt_call_name", buf);
175                         priv->caller_id = _vcui_show_default_image(eo, ad->win_quickpanel, QP_CONF_ICON);
176                 } else if (all_calls == 1) {
177                         call_data = _vcui_doc_get_first_call_data_from_list();
178                         __vcui_view_qp_update_caller(eo, call_data);
179                         __vcui_view_qp_draw_contact_image(eo, call_data);
180                 } else {
181                         CALL_UI_DEBUG("invalid case");
182                 }
183
184                 int caller_status = _vcui_doc_get_call_status(call_data);
185                 if (caller_status == CALL_HOLD) {
186                         CALL_UI_DEBUG("Hold call status");
187                         _vcui_create_quickpanel_unhold_button(vd);
188                 } else {
189                         _vcui_create_quickpanel_mute_button(vd);
190                 }
191
192         } else {
193                 CALL_UI_DEBUG("dialing/connecting view");
194                 call_data = _vcui_doc_get_call_data_mo_type();
195                 __vcui_view_qp_update_caller(eo, call_data);
196                 __vcui_view_qp_draw_contact_image(eo, call_data);
197         }
198         _vcui_create_quickpanel_end_button(vd);
199
200         evas_object_smart_callback_add(priv->caller_id, "clicked", __vcui_view_qp_caller_id_cb, vd);
201
202         if (!_vcui_doc_get_no_status_call_data_count()) {
203                 CALL_UI_DEBUG("no calls with NO_STATUS - update the timer");
204                 if (call_data != NULL)
205                         _vcui_view_common_set_each_time(_vcui_doc_get_call_start_time(call_data));
206         } else {
207                 _vcui_view_qp_update_text_status(vd, _("IDS_CALL_POP_CALLING"));
208         }
209 }
210
211 static Evas_Object *__vcui_view_qp_create_window(void)
212 {
213         Evas_Object *win;
214         double scale = elm_config_scale_get();
215
216         win = minicontrol_win_add("voicecall-quickpanel");
217         evas_object_resize(win, QUICKPANEL_WIDTH * scale, QUICKPANEL_HEIGHT * scale);
218
219         return win;
220 }
221
222 static Evas_Object *__vcui_view_qp_create_layout_main(Evas_Object *parent)
223 {
224         if (parent == NULL) {
225                 CALL_UI_DEBUG("ERROR");
226                 return NULL;
227         }
228
229         Evas_Object *ly;
230         ly = elm_layout_add(parent);
231         retvm_if(ly == NULL, NULL, "Failed elm_layout_add.");
232
233         elm_layout_theme_set(ly, "standard", "window", "integration");
234         evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
235         elm_win_resize_object_add(parent, ly);
236
237         edje_object_signal_emit(_EDJ(ly), "elm,state,show,indicator", "elm");
238         edje_object_signal_emit(_EDJ(ly), "elm,state,show,content", "elm");
239
240         return ly;
241 }
242
243 static Evas_Object *__vcui_view_qp_create_contents(void *data, char *group)
244 {
245         if (data == NULL) {
246                 CALL_UI_DEBUG("ERROR");
247                 return NULL;
248         }
249         voice_call_view_data_t *vd = (voice_call_view_data_t *)data;
250         vcui_app_call_data_t *ad = vd->app_data;
251         Evas_Object *eo = NULL;
252
253         /* load edje */
254         eo = _vcui_load_edj(ad->win_quickpanel, EDJ_NAME, group);
255
256         if (eo == NULL)
257                 return NULL;
258
259         return eo;
260 }
261
262 static int __vcui_view_qp_oncreate(voice_call_view_data_t *view_data, int param1, void *param2, void *param3)
263 {
264         CALL_UI_DEBUG("quickpanel view create!!");
265
266         voice_call_view_data_t *vd = view_data;
267         vcui_app_call_data_t *ad = vd->app_data;
268         vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)vd->priv;
269
270         if (!vd->layout) {
271                 ad->win_quickpanel = __vcui_view_qp_create_window();
272                 if (ad->win_quickpanel == NULL) {
273                         CALL_UI_DEBUG("ERROR");
274                         return VC_ERROR;
275                 }
276                 priv->rotate_angle = elm_win_rotation_get(ad->win_quickpanel);
277                 CALL_UI_DEBUG("current rotate angle(%d)", priv->rotate_angle);
278
279                 vd->layout = __vcui_view_qp_create_layout_main(ad->win_quickpanel);
280                 if (vd->layout == NULL) {
281                         CALL_UI_DEBUG("ERROR");
282                         return VC_ERROR;
283                 }
284         }
285
286         if (priv->client_msg_handler == NULL)
287                 priv->client_msg_handler = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, __vcui_qp_client_message_cb, vd);
288
289         __vcui_view_qp_onshow(view_data);
290         return VC_NO_ERROR;
291 }
292
293 static int __vcui_view_qp_onupdate(voice_call_view_data_t *view_data, void *update_data1, void *update_data2)
294 {
295         CALL_UI_DEBUG("quickpanel view update!!");
296
297         __vcui_view_qp_onshow(view_data);
298         return VC_NO_ERROR;
299 }
300
301 static int __vcui_view_qp_onhide(voice_call_view_data_t *view_data)
302 {
303         CALL_UI_DEBUG("quickpanel view hide!!");
304
305         evas_object_hide(view_data->layout);
306         return VC_NO_ERROR;
307 }
308
309 static int __vcui_view_qp_onshow(voice_call_view_data_t *view_data)
310 {
311         CALL_UI_DEBUG("quickpanel view show!!");
312         vcui_app_call_data_t *ad = view_data->app_data;
313         vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)view_data->priv;
314
315         if (ad->quickpanel_layout) {
316                 evas_object_del(ad->quickpanel_layout);
317                 ad->quickpanel_layout = NULL;
318         }
319
320         if (priv->rotate_angle == 0 || priv->rotate_angle == 180) {
321                 CALL_UI_DEBUG("portrait mode layout");
322                 evas_object_resize(ad->win_quickpanel, QUICKPANEL_WIDTH * ad->scale_factor, QUICKPANEL_HEIGHT * ad->scale_factor);
323                 ad->quickpanel_layout = __vcui_view_qp_create_contents(view_data, GRP_QUICKPANEL);
324         } else if (priv->rotate_angle == 90 || priv->rotate_angle == 270) {
325                 CALL_UI_DEBUG("landscape mode layout");
326                 evas_object_resize(ad->win_quickpanel, LSCAPE_QUICKPANEL_WIDTH * ad->scale_factor, QUICKPANEL_HEIGHT * ad->scale_factor);
327                 ad->quickpanel_layout = __vcui_view_qp_create_contents(view_data, GRP_QUICKPANEL_LSCAPE);
328         }
329
330         elm_object_part_content_set(view_data->layout, "elm.swallow.content", ad->quickpanel_layout);
331         evas_object_name_set(ad->quickpanel_layout, VIEW_QUICKPANEL_LAYOUT_ID);
332         CALL_UI_DEBUG("[========== QUICKPANEL:ad->quickpanel_layout Addr : [%p] ==========]", ad->quickpanel_layout);
333
334         __vcui_view_qp_draw_screen(ad->quickpanel_layout, view_data);
335
336         return VC_NO_ERROR;
337 }
338
339 static int __vcui_view_qp_ondestroy(voice_call_view_data_t *view_data)
340 {
341         CALL_UI_DEBUG("quickpanel view destroy!!");
342
343         vcui_app_call_data_t *ad = _vcui_get_app_data();
344         voice_call_view_data_t *vd = ad->view_st[VIEW_QUICKPANEL_VIEW];
345
346         vcui_view_qp_priv_t *priv = (vcui_view_qp_priv_t *)vd->priv;
347
348         if (priv != NULL) {
349                 if (priv->caller_id) {
350                         evas_object_del(priv->caller_id);
351                         priv->caller_id = NULL;
352                 }
353
354                 if (priv->client_msg_handler != NULL)
355                         ecore_event_handler_del(priv->client_msg_handler);
356
357                 free(priv);
358                 priv = NULL;
359         }
360
361         if (ad->quickpanel_layout) {
362                 evas_object_del(ad->quickpanel_layout);
363                 ad->quickpanel_layout = NULL;
364         }
365
366         if (vd->layout != NULL) {
367                 evas_object_hide(vd->layout);
368                 evas_object_del(vd->layout);
369                 vd->layout = NULL;
370         }
371
372         ad->view_st[VIEW_QUICKPANEL_VIEW] = NULL;
373
374         if (ad->win_quickpanel) {
375                 evas_object_del(ad->win_quickpanel);
376                 ad->win_quickpanel = NULL;
377         }
378
379         _vcui_cache_flush();
380         return VC_NO_ERROR;
381 }
382
383 void _vcui_view_qp_update_text_status(voice_call_view_data_t *vd, char *txt_status)
384 {
385         CALL_UI_DEBUG("..");
386         vcui_app_call_data_t *ad = NULL;
387         int valid = 0;
388
389         if (vd == NULL) {
390                 CALL_UI_DEBUG("View Data is NULL");
391                 return;
392         }
393         ad = vd->app_data;
394
395         if (ad->win_quickpanel && ad->quickpanel_layout) {
396                 valid = _vcui_check_valid_eo(ad->quickpanel_layout, VIEW_QUICKPANEL_LAYOUT_ID);
397                 if (valid == -1) {
398                         CALL_UI_DEBUG("[========== QUICKPANELVIEW : Invalid Evas Object, ad->quickpanel_layout : %p ==========]", ad->quickpanel_layout);
399                         return;
400                 }
401                 edje_object_part_text_set(_EDJ(ad->quickpanel_layout), "txt_timer", txt_status);
402         }
403
404 }
405
406 void _vc_ui_view_qp_set_call_timer(Evas_Object *qp_layout, char *pcall_timer)
407 {
408         int valid = -1;
409
410         VCUI_RETURN_IF_FAIL(qp_layout);
411         valid = _vcui_check_valid_eo(qp_layout, VIEW_QUICKPANEL_LAYOUT_ID);
412         if (valid == -1) {
413                 CALL_UI_DEBUG("[========== QUICKPANELVIEW : Invalid Evas Object, ad->quickpanel_layout : %p ==========]", qp_layout);
414                 return;
415         }
416         if (!_vcui_doc_get_no_status_call_data_count())
417                 edje_object_part_text_set(_EDJ(qp_layout), "txt_timer", _(pcall_timer));
418 }
419
420 void _vcui_view_qp_install_window(voice_call_view_data_t *vd)
421 {
422         CALL_UI_DEBUG("..");
423         Evas_Object *win;
424         vcui_app_call_data_t *ad = NULL;
425
426         if (vd == NULL) {
427                 CALL_UI_DEBUG("View Data is NULL");
428                 return;
429         }
430
431         ad = vd->app_data;
432         if (ad == NULL) {
433                 CALL_UI_DEBUG("app Data is NULL");
434                 return;
435         }
436
437         win = ad->win_quickpanel;
438         if (ad->win_quickpanel == NULL) {
439                 CALL_UI_DEBUG("QP win is NULL");
440                 return;
441         }
442         evas_object_show(win);
443         evas_object_show(vd->layout);
444 }
445
446 void _vcui_view_qp_uninstall_window(voice_call_view_data_t *vd)
447 {
448         CALL_UI_DEBUG("..");
449         Evas_Object *win;
450         vcui_app_call_data_t *ad = NULL;
451
452         if (vd == NULL) {
453                 CALL_UI_DEBUG("View Data is NULL");
454                 return;
455         }
456
457         ad = vd->app_data;
458         if (ad == NULL) {
459                 CALL_UI_DEBUG("app Data is NULL");
460                 return;
461         }
462
463         win = ad->win_quickpanel;
464         if (ad->win_quickpanel == NULL) {
465                 CALL_UI_DEBUG("QP win is NULL");
466                 return;
467         }
468         elm_win_quickpanel_set(win, 0);
469
470         evas_object_hide(ad->win_quickpanel);
471         evas_object_hide(vd->layout);
472 }