2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://floralicense.org/license
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.
17 #include "msg-ui-composer-bubble.h"
18 #include "msg-ui-composer-data.h"
19 #include "msg-ui-composer-main.h"
20 #include "msg-ui-composer-recipient.h"
21 #include "msg-ui-composer-external.h"
22 #include "msg-ui-composer-common.h"
25 #define BUBBLE_TITLE_MENU_GENLIST_MAX_LINE 4
26 #define BUBBLE_TITLE_MENU_GENLIST_1LINE_HEIGHT 112
27 #define BUBBLE_TITLE_MENU_GENLIST_2LINE_HEIGHT 129
28 #define BUBBLE_RETURN_DELETE_CANCEL 1000
30 Elm_Genlist_Item_Class itc_popup = {0,}; /** itc for list style popup */
32 Evas_Coord g_mouse_down_x = 0, g_mouse_down_y = 0;
34 static void _bubble_show_normal_mode(void *data)
38 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
40 MSG_COMPOSER_VIEW_DATA_S *cd = data;
41 PMSG_BUBBLE_DATA pData = cd->bubble_data;
42 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData);
44 elm_object_part_content_unset(pData->parent_layout, "swl.sel_all");
45 evas_object_hide(pData->sel_all_ly);
48 PMSG_APP_CONV_DATA_S item_data = NULL;
50 if (pData->select_info) {
51 evas_object_del(pData->select_info);
52 pData->select_info = NULL;
55 elm_check_state_set(pData->sel_all_box, EINA_FALSE);
59 EINA_LIST_FOREACH(pData->realized_list, l, item_data) {
61 evas_object_hide(item_data->chk);
62 if (item_data->isCheck)
63 elm_check_state_set(item_data->chk, EINA_FALSE);
64 elm_object_signal_emit(item_data->ly, "elm,state,select,disable", "elm");
65 evas_object_event_callback_del(item_data->ly, EVAS_CALLBACK_MOUSE_DOWN, msg_ui_bubble_item_mouse_down_cb);
71 EINA_LIST_FOREACH(pData->bubble_list, l, item_data) {
73 item_data->isCheck = false;
77 pData->chk_list = eina_list_free(pData->chk_list);
79 msg_ui_bubble_change_normal_navi_control(pData);
81 pData->viewmode = BUBBLE_NORMAL_VIEW;
86 static void _bubble_add_edit_controlbar(PMSG_BUBBLE_DATA pData)
90 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)pData->callback_data;
92 elm_object_item_part_content_unset(cd->navi_it, "toolbar_button1");
93 elm_object_item_part_content_unset(cd->navi_it, "toolbar_button2");
94 elm_object_item_part_content_unset(cd->navi_it, "toolbar_more_btn");
96 Evas_Object *del_btn = elm_button_add(cd->navi_bar);
97 elm_object_style_set(del_btn, "naviframe/toolbar/left");
98 elm_object_text_set(del_btn, dgettext("sys_string", "IDS_COM_SK_DELETE"));
99 evas_object_smart_callback_add(del_btn, "clicked", msg_ui_bubble_ctlbar_delete_cb, pData->callback_data);
100 elm_object_item_part_content_set(cd->navi_it, "toolbar_button1", del_btn);
101 elm_object_disabled_set(del_btn, EINA_TRUE);
103 Evas_Object *cancel_btn = elm_button_add(cd->navi_bar);
104 elm_object_style_set(cancel_btn, "naviframe/toolbar/right");
105 elm_object_text_set(cancel_btn, dgettext("sys_string", "IDS_COM_SK_CANCEL"));
106 evas_object_smart_callback_add(cancel_btn, "clicked", msg_ui_bubble_ctlbar_cancel_cb, pData->callback_data);
107 elm_object_item_part_content_set(cd->navi_it, "toolbar_button2", cancel_btn);
112 static void _bubble_change_edit_mode_title(PMSG_BUBBLE_DATA pData)
116 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData);
118 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)pData->callback_data;
120 Evas_Object *content = elm_object_part_content_get(cd->navi_title_layout, "title_btn");
123 evas_object_hide(content);
125 elm_object_part_content_unset(cd->navi_title_layout, "title_btn");
126 elm_object_part_text_set(cd->navi_title_layout, "title_text", dgettext("sys_string", "IDS_COM_SK_DELETE"));
130 static void _sel_all_ly_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
134 PMSG_BUBBLE_DATA pData = (PMSG_BUBBLE_DATA) data;
136 pData->sel_all_checked = !pData->sel_all_checked;
137 elm_check_state_pointer_set(pData->sel_all_box, &pData->sel_all_checked);
139 msg_ui_bubble_sel_all_clicked_cb(data, NULL, NULL);
144 static void _bubble_add_navi_select_all_ly(PMSG_BUBBLE_DATA pData)
146 if (!pData->sel_all_ly) {
147 pData->sel_all_ly = elm_layout_add(pData->bubble_layout);
148 elm_layout_theme_set(pData->sel_all_ly, "genlist", "item", "select_all/default");
149 evas_object_size_hint_weight_set(pData->sel_all_ly, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
150 evas_object_size_hint_align_set(pData->sel_all_ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
151 evas_object_event_callback_add(pData->sel_all_ly, EVAS_CALLBACK_MOUSE_DOWN, _sel_all_ly_mouse_down_cb, pData);
153 pData->sel_all_box = elm_check_add(pData->sel_all_ly);
154 elm_check_state_pointer_set(pData->sel_all_box, &pData->sel_all_checked);
155 evas_object_propagate_events_set(pData->sel_all_box, EINA_FALSE);
156 evas_object_smart_callback_add(pData->sel_all_box, "changed", msg_ui_bubble_sel_all_clicked_cb, pData);
157 evas_object_show(pData->sel_all_box);
159 elm_object_part_content_set(pData->sel_all_ly, "elm.icon", pData->sel_all_box);
160 elm_object_part_text_set(pData->sel_all_ly, "elm.text", dgettext("sys_string", "IDS_COM_BODY_SELECT_ALL"));
163 evas_object_show(pData->sel_all_ly);
164 elm_object_part_content_set(pData->parent_layout, "swl.sel_all", pData->sel_all_ly);
167 static void _progress_popup_delete(PMSG_BUBBLE_DATA pData)
170 evas_object_del(pData->popup);
174 if (pData->select_info) {
175 evas_object_del(pData->select_info);
176 pData->select_info = NULL;
180 static void _delete_finish(PMSG_BUBBLE_DATA pData)
183 _progress_popup_delete(pData);
185 if (pData->del_index + 1 == pData->bubble_count) {
186 pData->bubble_count = 0;
189 _bubble_show_normal_mode(pData->callback_data);
190 msg_ui_bubble_list_load(pData);
192 pData->del_thread = NULL;
195 static void _del_thread_feedback_fn(void *data, Ecore_Thread *thread, void *msg_data)
197 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !thread || !data || !msg_data);
199 PMSG_BUBBLE_DATA pData = (PMSG_BUBBLE_DATA)data;
200 char buf[DEF_BUF_LEN_S] = {0,};
203 D_MSG("Delete message return value =[%d]", *ret);
204 if (*ret == MSG_SUCCESS) {
205 if (pData->progressbar) {
206 snprintf(buf, sizeof(buf), "%d/%d %s", pData->del_index + 1, pData->check_cnt, dgettext("sys_string", "IDS_COM_POP_DELETED"));
207 elm_object_text_set(pData->progresslabel, buf);
208 elm_progressbar_value_set(pData->progressbar, (double) (pData->del_index + 1) / pData->check_cnt);
210 } else if (*ret == BUBBLE_RETURN_DELETE_CANCEL) {
211 if (pData->del_cancel == true) {
212 _delete_finish(pData);
216 pData->del_cancel = false;
221 _progress_popup_delete(pData);
223 msg_ui_bubble_show_notify(pData, dgettext("sys_string", "IDS_COM_POP_UNABLE_TO_DELETE"));
225 _bubble_show_normal_mode(pData->callback_data);
226 msg_ui_bubble_list_load(pData);
228 pData->del_thread = NULL;
235 if (pData->del_index + 1 == pData->check_cnt) {
236 msg_ui_bubble_show_deleted_info(pData);
237 _delete_finish(pData);
246 static void _del_thread_fn(void *data, Ecore_Thread *thread)
248 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
250 PMSG_BUBBLE_DATA pData = (PMSG_BUBBLE_DATA)data;
253 PMSG_APP_CONV_DATA_S item_data = NULL;
254 EINA_LIST_FOREACH(pData->chk_list, l, item_data) {
255 int *ret = calloc(1, sizeof(int));
257 if (pData->del_cancel == true) {
258 *ret = BUBBLE_RETURN_DELETE_CANCEL;
259 ecore_thread_feedback(thread, (void *)ret);
264 D_MSG("del_msg_id = [%d]", item_data->msgId);
265 *ret = msg_delete_message(pData->msgHandle, item_data->msgId);
267 ecore_thread_feedback(thread, (void *)ret);
269 if (*ret != MSG_SUCCESS)
272 *ret = MSG_ERR_NULL_POINTER;
273 ecore_thread_feedback(thread, (void *)ret);
280 static void _del_all_item(PMSG_BUBBLE_DATA pData)
284 msg_error_t err = MSG_SUCCESS;
286 err = msg_delete_thread_message_list(pData->msgHandle, pData->threadId, false);
288 if (err == MSG_SUCCESS) {
289 pData->bubble_count = 0;
290 msg_ui_bubble_show_deleted_info(pData);
292 msg_ui_bubble_show_notify(pData, dgettext("sys_string", "IDS_COM_POP_UNABLE_TO_DELETE"));
294 _bubble_show_normal_mode(pData->callback_data);
295 msg_ui_bubble_list_load(pData);
301 void msg_ui_bubble_change_normal_navi_control(PMSG_BUBBLE_DATA pData)
306 MSG_COMPOSER_VIEW_DATA_S *cd = pData->callback_data;
308 Evas_Object *btn1 = elm_object_item_part_content_unset(cd->navi_it, "toolbar_button1");
309 Evas_Object *btn2 = elm_object_item_part_content_unset(cd->navi_it, "toolbar_button2");
312 evas_object_del(btn1);
315 evas_object_del(btn2);
318 evas_object_show(cd->back_btn);
319 elm_object_part_content_set(cd->navi_title_layout, "prev_btn", cd->back_btn);
323 evas_object_show(cd->more_btn);
324 elm_object_part_content_set(cd->navi_title_layout, "more_btn", cd->more_btn);
327 if (cd->compose_btn && pData->isRotate == true) {
328 evas_object_show(cd->compose_btn);
329 elm_object_part_content_set(cd->navi_title_layout, "compose_btn", cd->compose_btn);
333 msg_ui_composer_navi_title_set(cd);
335 if (pData->msg_type == MSG_TYPE_SMS_WAPPUSH || pData->msg_type == MSG_TYPE_SMS_CB || pData->msg_type == MSG_TYPE_SMS_SYNCML)
336 msg_ui_composer_editable_set(cd, EINA_FALSE);
338 msg_ui_composer_editable_set(cd, EINA_TRUE);
341 void msg_ui_popup_close_clicked_cb(void *data, Evas_Object *obj, void *event_info)
343 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
345 PMSG_BUBBLE_DATA pData = (PMSG_BUBBLE_DATA)data;
348 evas_object_del(pData->popup);
353 static void __msg_ui_bubble_unblock(PMSG_BUBBLE_DATA pData, char *addr)
356 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData || !addr);
358 msg_error_t err = msg_common_delete_block_number(pData->msgHandle, addr);
360 if (err == MSG_SUCCESS) {
361 char msg[DEF_BUF_LEN] = {0,};
362 const char *str = dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_PS_UNBLOCKED");
363 snprintf(msg, sizeof(msg), str, addr);
364 msg_ui_bubble_show_notify(pData, msg);
366 D_EMSG("Unblock failed %d", err);
370 static void __msg_ui_bubble_block(PMSG_BUBBLE_DATA pData, char *addr)
372 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData || !addr);
374 msg_error_t err = msg_common_add_block_number(pData->msgHandle, addr);
376 if (err == MSG_SUCCESS) {
377 char msg[DEF_BUF_LEN] = {0,};
378 const char *str = dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_PS_BLOCKED");
379 snprintf(msg, sizeof(msg), str, addr);
380 msg_ui_bubble_show_notify(pData, msg);
381 } else if (err == MSG_ERR_FILTER_DUPLICATED){
382 msg_ui_bubble_show_notify(pData, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_BLOCKNUMBERDUPLICATED"));
384 D_EMSG("block failed %d", err);
389 void __msg_block_ok_clicked_cb(void *data, Evas_Object *obj, void *event_info)
391 PMSG_BUBBLE_DATA pData = (PMSG_BUBBLE_DATA)data;
394 evas_object_del(pData->popup);
398 char* addr = (char *)evas_object_data_get(obj, "address");
399 __msg_ui_bubble_block(pData, addr);
402 static void __msg_ui_bubble_create_block_popup(PMSG_BUBBLE_DATA pData, char *addr)
405 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData || !addr);
407 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)pData->callback_data;
408 char title[DEF_BUF_LEN] = {0,};
411 evas_object_del(pData->popup);
415 Evas_Object *popup = elm_popup_add(cd->main_window);
416 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
417 const char *str = dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_BLOCK_PS_Q");
418 snprintf(title, sizeof(title), str, addr);
419 elm_object_text_set(popup, title);
421 Evas_Object *btn_ok = elm_button_add(popup);
422 elm_object_style_set(btn_ok, "popup_button/default");
423 evas_object_data_set(btn_ok, "address", addr);
424 elm_object_text_set(btn_ok, dgettext("sys_string", "IDS_COM_SK_OK"));
425 elm_object_part_content_set(popup, "button1", btn_ok);
426 evas_object_smart_callback_add(btn_ok, "clicked", __msg_block_ok_clicked_cb, pData);
428 Evas_Object *btn_cancel = elm_button_add(popup);
429 elm_object_style_set(btn_cancel, "popup_button/default");
430 elm_object_text_set(btn_cancel, dgettext("sys_string", "IDS_COM_SK_CANCEL"));
431 elm_object_part_content_set(popup, "button2", btn_cancel);
432 evas_object_smart_callback_add(btn_cancel, "clicked", msg_ui_popup_close_clicked_cb, pData);
434 evas_object_show(popup);
435 pData->popup = popup;
438 static void __msg_ui_bubble_list_popup_selected_cb(void *data, Evas_Object *obj, void *event_info)
442 BUBBLE_ADDRESS_INFO *addr_info = (BUBBLE_ADDRESS_INFO *)data;
443 PMSG_BUBBLE_DATA bubble_data = evas_object_data_get(obj, "bubble_data");
446 D_EMSG("[ERROR] bubble_data is NULL");
450 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
453 D_EMSG("[ERROR] composer data is NULL");
457 if (bubble_data->popup) {
458 evas_object_del(bubble_data->popup);
459 bubble_data->popup = NULL;
462 const char *label = elm_object_item_text_get((Elm_Object_Item *) event_info);
464 if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_BODY_CALL")) == 0) {
465 msg_ui_bubble_launch_voice_call(addr_info->address);
466 } else if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_BODY_VIDEO_CALL")) == 0) {
467 msg_ui_bubble_launch_video_call(addr_info->address);
468 } else if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_OPT_ADD_TO_CONTACTS")) == 0) { /* Add to contact with phone number string... */
469 msg_ui_composer_launch_contact_list_ug(cd, MSG_CT_UG_REQUEST_UPDATE_WITH_NUM, addr_info->address);
470 } else if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGC_OPT_VIEW_CONTACT")) == 0) {
471 msg_ui_composer_launch_contact_detail_ug(cd, addr_info->contact_id);
472 } else if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_SEND_EMAIL")) == 0) {
473 service_h svc_handle;
474 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
475 D_EMSG("service_create() is failed !!");
477 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_RUN_TYPE, MSG_BUNDLE_VALUE_EMAIL_COMPOSE);
478 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TO, addr_info->address);
480 msg_ui_composer_launch_email_create(cd, svc_handle);
482 msg_ui_bubble_show_notify(bubble_data, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_UNABLE_TO_OPEN"));
484 service_destroy(svc_handle);
486 } else if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_SK3_BLOCK")) == 0) {
487 __msg_ui_bubble_create_block_popup(bubble_data, addr_info->address);
488 } else if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_UNBLOCK")) == 0) {
489 __msg_ui_bubble_unblock(bubble_data, addr_info->address);
495 static char *__msg_ui_bubble_gl_text_get(void *data, Evas_Object *obj, const char *part)
497 PMSG_BUBBLE_DATA bubble_data = evas_object_data_get(obj, "bubble_data");
498 BUBBLE_ADDRESS_INFO *addr_info = (BUBBLE_ADDRESS_INFO *)data;
499 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, !bubble_data || !addr_info, NULL);
501 if (g_strcmp0(part, "elm.text") == 0) {
502 return strdup((char *)data);
503 } else if (g_strcmp0(part, "elm.text.1") == 0) {
504 if (addr_info->contact_id > 0 && addr_info->name[0] != '\0')
505 return strdup(addr_info->name);
506 else if (addr_info->address[0] != '\0')
507 return strdup (addr_info->address);
509 return strdup(dgettext("sys_string", "IDS_COM_BODY_UNKNOWN"));
510 } else if (g_strcmp0(part, "elm.text.2") == 0) {
511 if (addr_info->address[0] != '\0')
512 return strdup(addr_info->address);
514 return strdup(dgettext("sys_string", "IDS_COM_BODY_UNKNOWN"));
520 static Evas_Object * __msg_ui_bubble_gl_content_get(void *data, Evas_Object *obj, const char *part)
522 // Currently, this function do nothing, caller_id concept is not determined
523 // TODO: add callerId
527 static void __msg_ui_bubble_gl_sel(void *data, Evas_Object *obj, void *event_info)
529 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
530 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
531 Elm_Object_Item *item = NULL;
532 BUBBLE_ADDRESS_INFO *addr_info = NULL;
534 Evas_Object *popup = NULL;
535 Evas_Object *list = NULL;
536 Evas_Object *btn_close = NULL;
537 unsigned char num_type;
539 item = (Elm_Object_Item *) event_info;
540 MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, !item, "Item is NULL or Item is not Message item\n");
542 addr_info = (BUBBLE_ADDRESS_INFO *) elm_object_item_data_get(item);
543 MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, addr_info == NULL, "item_data is NULL");
545 elm_genlist_item_selected_set(item, 0);
548 if (bubble_data->popup) {
549 evas_object_del(bubble_data->popup);
550 bubble_data->popup = NULL;
553 num_type = msg_ui_bubble_check_word_type(addr_info->address);
556 popup = elm_popup_add(cd->main_window);
557 elm_object_style_set(popup, "min_menustyle");
558 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
560 btn_close = elm_button_add(popup);
561 elm_object_style_set(btn_close, "popup_button/default");
562 elm_object_text_set(btn_close, dgettext("sys_string", "IDS_COM_BODY_CLOSE"));
563 elm_object_part_content_set(popup, "button1", btn_close);
564 evas_object_smart_callback_add(btn_close, "clicked", msg_ui_popup_close_clicked_cb, bubble_data);
566 list = elm_list_add(popup);
567 elm_list_mode_set(list, ELM_LIST_EXPAND);
569 evas_object_data_set(list, "bubble_data", bubble_data);
571 if (num_type == WORD_TYPE_NUM) {
572 elm_list_item_append(list, dgettext("sys_string", "IDS_COM_BODY_CALL"), NULL, NULL, __msg_ui_bubble_list_popup_selected_cb, (void *)addr_info);
573 elm_list_item_append(list, dgettext("sys_string", "IDS_COM_BODY_VIDEO_CALL"), NULL, NULL, __msg_ui_bubble_list_popup_selected_cb, (void *)addr_info);
574 } else if (num_type == WORD_TYPE_EMAIL) {
575 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_SEND_EMAIL"), NULL, NULL, __msg_ui_bubble_list_popup_selected_cb, (void *)addr_info);
577 D_MSG("invalid_numtype");
580 if (addr_info->contact_id > 0) {
581 elm_object_part_text_set(popup, "title,text", addr_info->name);
582 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSGC_OPT_VIEW_CONTACT"), NULL, NULL, __msg_ui_bubble_list_popup_selected_cb, (void *)addr_info);
584 elm_object_part_text_set(popup, "title,text", addr_info->address);
585 elm_list_item_append(list, dgettext("sys_string", "IDS_COM_OPT_ADD_TO_CONTACTS"), NULL, NULL, __msg_ui_bubble_list_popup_selected_cb, (void *)addr_info);
588 if (num_type == WORD_TYPE_NUM) {
591 err = msg_common_check_block_number(bubble_data->msgHandle, addr_info->address, &isBlock);
593 if (err == MSG_SUCCESS) {
594 if (isBlock == false)
595 elm_list_item_append(list, dgettext("sys_string", "IDS_COM_SK3_BLOCK"), NULL, NULL, __msg_ui_bubble_list_popup_selected_cb, (void *)addr_info);
597 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_UNBLOCK"), NULL, NULL, __msg_ui_bubble_list_popup_selected_cb, (void *)addr_info);
602 elm_object_content_set(popup, list);
603 evas_object_show(popup);
605 bubble_data->popup = popup;
607 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
610 static void _dim_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
612 msg_ui_bubble_close_title_menu_genlist(data);
615 void msg_ui_bubble_open_title_menu_genlist(PMSG_BUBBLE_DATA bubble_data)
618 MSG_UI_RETM_IF(MSG_UI_LEVEL_ASSERT, !bubble_data, "[ERROR] bubble_data is NULL !!");
620 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
621 MSG_UI_RETM_IF(MSG_UI_LEVEL_ASSERT, !cd, "[ERROR] cd is NULL !!");
624 /** 2. create box -- for setting min. size of genlist.*/
625 Evas_Object *box = elm_box_add(cd->content_layout);
626 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
627 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
628 evas_object_show(box);
630 elm_object_part_content_set(cd->content_layout, "swl.bubble.titlemenu", box);
632 /** 3. create genlist */
633 Evas_Object *genlist = elm_genlist_add(box);
634 elm_object_theme_set(genlist, cd->th);
635 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
636 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
637 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
638 evas_object_data_set(genlist, "bubble_data", bubble_data);
639 evas_object_show(genlist);
641 elm_box_pack_end(box, genlist);
643 bubble_data->title_genlist = genlist;
644 cd->title_menu_layout = box;
646 elm_object_signal_callback_add(cd->content_layout, "action,clicked", "", _dim_clicked_cb, bubble_data);
648 if (bubble_data->addr_list.addr_cnt == 1) {
649 unsigned char num_type;
650 /** 3.1 set genlist styles */
651 bubble_data->itc_title_single.item_style = "1text.custom";
652 bubble_data->itc_title_single.func.text_get = __msg_ui_bubble_gl_text_get;
653 bubble_data->itc_title_single.func.content_get = NULL;
654 bubble_data->itc_title_single.func.state_get = NULL;
655 bubble_data->itc_title_single.func.del = NULL;
657 /** 3.2 genlist list load */
659 num_type = msg_ui_bubble_check_word_type(bubble_data->addr_list.addr_info[0].address);
661 if (num_type == WORD_TYPE_NUM) {
662 elm_genlist_item_append(genlist, &(bubble_data->itc_title_single), dgettext("sys_string", "IDS_COM_BODY_CALL"), NULL, ELM_GENLIST_ITEM_NONE, msg_ui_bubble_ctlbar_call_cb, cd);
663 elm_genlist_item_append(genlist, &(bubble_data->itc_title_single), dgettext("sys_string", "IDS_COM_BODY_VIDEO_CALL"), NULL, ELM_GENLIST_ITEM_NONE, msg_ui_bubble_ctlbar_vcall_cb, cd);
664 } else if (num_type == WORD_TYPE_EMAIL) {
665 elm_genlist_item_append(genlist, &(bubble_data->itc_title_single), dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_SEND_EMAIL"), NULL, ELM_GENLIST_ITEM_NONE, msg_ui_bubble_ctlbar_email_cb, cd);
667 D_MSG("invalid_numtype");
670 if (bubble_data->addr_list.addr_info[0].contact_id > 0)
671 elm_genlist_item_append(genlist, &(bubble_data->itc_title_single), dgettext(MESSAGE_PKGNAME, "IDS_MSGC_OPT_VIEW_CONTACT"), NULL, ELM_GENLIST_ITEM_NONE, msg_ui_bubble_ctlbar_view_ct_detail_cb, cd);
673 elm_genlist_item_append(genlist, &(bubble_data->itc_title_single), dgettext("sys_string", "IDS_COM_OPT_ADD_TO_CONTACTS"), NULL, ELM_GENLIST_ITEM_NONE, msg_ui_bubble_ctlbar_add_to_contact_cb, cd);
675 if (num_type == WORD_TYPE_NUM) {
678 err = msg_common_check_block_number(bubble_data->msgHandle, bubble_data->addr_list.addr_info[0].address, &isBlock);
680 if (err == MSG_SUCCESS) {
681 if (isBlock == false)
682 elm_genlist_item_append(genlist, &(bubble_data->itc_title_single), dgettext("sys_string", "IDS_COM_SK3_BLOCK"), NULL, ELM_GENLIST_ITEM_NONE, msg_ui_bubble_ctlbar_block_cb, bubble_data);
684 elm_genlist_item_append(genlist, &(bubble_data->itc_title_single), dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_UNBLOCK"), NULL, ELM_GENLIST_ITEM_NONE, msg_ui_bubble_ctlbar_unblock_cb, bubble_data);
688 evas_object_size_hint_min_set(box, 0, BUBBLE_TITLE_MENU_GENLIST_1LINE_HEIGHT * elm_genlist_items_count(genlist));
689 } else if (bubble_data->addr_list.addr_cnt > 1) {
690 /** 3.1 set genlist styles */
691 bubble_data->itc_title.item_style = "2text.1icon.2.custom";
692 bubble_data->itc_title.func.text_get = __msg_ui_bubble_gl_text_get;
693 bubble_data->itc_title.func.content_get = __msg_ui_bubble_gl_content_get;
694 bubble_data->itc_title.func.state_get = NULL;
695 bubble_data->itc_title.func.del = NULL;
697 /** 3.2 genlist list load */
698 for (i = 0; i < bubble_data->addr_list.addr_cnt; i++)
699 elm_genlist_item_append(genlist, &(bubble_data->itc_title), &bubble_data->addr_list.addr_info[i], NULL, ELM_GENLIST_ITEM_NONE, __msg_ui_bubble_gl_sel, bubble_data);
701 /** Determine genlist size to show - it shows maxmum 3 rows */
702 if (bubble_data->addr_list.addr_cnt >= BUBBLE_TITLE_MENU_GENLIST_MAX_LINE)
703 evas_object_size_hint_min_set(box, 0, BUBBLE_TITLE_MENU_GENLIST_2LINE_HEIGHT * BUBBLE_TITLE_MENU_GENLIST_MAX_LINE);
705 evas_object_size_hint_min_set(box, 0, BUBBLE_TITLE_MENU_GENLIST_2LINE_HEIGHT * bubble_data->addr_list.addr_cnt);
709 /** emit signal for changing state of swl.bubble.titlemenu to open */
710 elm_object_signal_emit(cd->content_layout, "elm,state,title_menu,open", "");
712 bubble_data->title_menu_opened = true;
717 void msg_ui_bubble_close_title_menu_genlist(PMSG_BUBBLE_DATA bubble_data)
720 MSG_UI_RETM_IF(MSG_UI_LEVEL_ASSERT, !bubble_data, "[ERROR] bubble_data is NULL !!");
722 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
723 MSG_UI_RETM_IF(MSG_UI_LEVEL_ASSERT, !cd, "[ERROR] cd is NULL !!");
725 bubble_data->title_menu_opened = false;
727 elm_object_signal_emit(cd->content_layout, "elm,state,title_menu,close", "");
729 Evas_Object *layout = elm_object_part_content_unset(cd->content_layout, "swl.bubble.titlemenu");
731 evas_object_del(layout);
736 void msg_ui_bubble_title_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
741 D_EMSG("data is NULL");
745 MSG_COMPOSER_VIEW_DATA_S *cd = data;
746 PMSG_BUBBLE_DATA bubble_data = cd->bubble_data;
749 evas_object_del(cd->ctx_popup);
750 cd->ctx_popup = NULL;
753 if (bubble_data->title_menu_opened) {
754 msg_ui_bubble_close_title_menu_genlist(bubble_data);
756 msg_ui_bubble_open_title_menu_genlist(bubble_data);
762 void msg_ui_bubble_msg_storage_change_cb(msg_handle_t handle, msg_storage_change_type_t type, msg_id_list_s *pMsgIdList, void *user_param)
766 if (!user_param || !pMsgIdList)
769 MSG_COMPOSER_VIEW_DATA_S *cd = user_param;
770 PMSG_BUBBLE_DATA BubbleData = cd->bubble_data;
772 if (BubbleData == NULL)
775 if (BubbleData->ug_state == BUBBLE_UG_DESTROY)
778 if (type == MSG_STORAGE_CHANGE_CONTACT) {
779 msg_ui_bubble_contact_info_update(BubbleData);
781 } else if (type == MSG_STORAGE_CHANGE_DELETE) {
786 for (i = 0; i < pMsgIdList->nCount; i++) {
787 msg_struct_t conv = msg_create_struct(MSG_STRUCT_CONV_INFO);
788 msg_error_t err = MSG_SUCCESS;
790 err = msg_get_conversation(BubbleData->msgHandle, pMsgIdList->msgIdList[i], conv);
791 if (err != MSG_SUCCESS) {
792 msg_release_struct(&conv);
799 msg_get_int_value(conv, MSG_CONV_MSG_FOLDER_ID_INT, &folder_id);
800 msg_get_int_value(conv, MSG_CONV_MSG_THREAD_ID_INT, &thread_id);
801 msg_get_int_value(conv, MSG_CONV_MSG_ID_INT, &msg_id);
803 if (BubbleData->threadId == thread_id && folder_id != MSG_SPAMBOX_ID) {
805 case MSG_STORAGE_CHANGE_INSERT :
806 if (msg_id != BubbleData->copy_id)
807 msg_ui_bubble_list_append(BubbleData, conv);
809 BubbleData->copy_id = 0;
812 case MSG_STORAGE_CHANGE_UPDATE :
813 if (msg_id == BubbleData->draft_msg_id) {
814 BubbleData->draft_msg_id = 0;
815 msg_ui_bubble_list_append(BubbleData, conv);
817 msg_ui_bubble_item_data_update(BubbleData, conv);
827 msg_release_struct(&conv);
833 static void __backup_thread_fn(void *data, Ecore_Thread *thread)
836 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
839 char *folderpath = NULL;
840 char *foldername = NULL;
841 char *filename = NULL;
842 msg_struct_list_s msg_list;
843 msg_error_t err = MSG_SUCCESS;
844 int bubble_count = 0;
847 // initialize backup file path
848 memset(bubble_data->backupPath, 0x00, sizeof(bubble_data->backupPath));
850 err = msg_get_conversation_view_list(bubble_data->msgHandle, bubble_data->threadId, &msg_list);
851 if (err != MSG_SUCCESS)
854 bubble_count = msg_list.nCount;
855 if (bubble_count <= 0) {
856 msg_release_list_struct(&msg_list);
860 foldername = msg_ui_bubble_create_export_folder_name();
862 D_EMSG("create folder error!!!");
866 folderpath = msg_ui_bubble_create_export_folder(bubble_data, foldername);
868 D_EMSG("file path is NULL!!!");
872 filename = msg_ui_bubble_create_export_file_name();
874 D_EMSG("filename create error!!!");
878 snprintf(bubble_data->backupPath, sizeof(bubble_data->backupPath), "%s/%s", folderpath, filename);
881 fd = open(bubble_data->backupPath, O_RDWR | O_CREAT | O_DSYNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
883 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "open error");
888 for (i = 0; i < bubble_count; i++) {
890 if (bubble_data->backup_cancel)
893 char *msg_str = msg_ui_bubble_create_export_string(bubble_data, msg_list.msg_struct_info[i]);
895 if (write(fd, msg_str, strlen(msg_str)) > 0)
903 msg_release_list_struct(&msg_list);
915 static void __backup_thread_end_fn(void *data, Ecore_Thread *thread)
917 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
919 if (bubble_data->popup) {
920 evas_object_del(bubble_data->popup);
921 bubble_data->popup = NULL;
924 if (bubble_data->backupPath[0] == '\0') {
925 /** if backup file path is NULL, it can be considered as a fail to backup */
926 msg_ui_bubble_status_message_post(bubble_data, dgettext("sys_string", "IDS_COM_POP_FAILED"));
930 if (bubble_data->backup_type == BUBBLE_BACKUP_TYPE_SD) {
931 if (bubble_data->backup_cancel) {
932 msg_ui_bubble_status_message_post(bubble_data, dgettext("sys_string", "IDS_COM_POP_CANCELLED"));
934 msg_ui_bubble_status_message_post(bubble_data, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_SAVED_IN_MY_FILES"));
936 } else if (bubble_data->backup_type == BUBBLE_BACKUP_TYPE_EMAIL) {
937 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
939 service_h svc_handle;
940 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
941 D_EMSG("service_create() is failed !!");
943 service_set_operation(svc_handle, SERVICE_OPERATION_SEND);
944 service_set_app_id(svc_handle, "email-composer-efl");
945 service_set_uri(svc_handle, bubble_data->backupPath);
946 service_add_extra_data(svc_handle, "RUN_TYPE","5");
948 Ecore_X_Window win_id = elm_win_xwindow_get(cd->main_window);
949 service_set_window(svc_handle, win_id);
951 service_send_launch_request(svc_handle, NULL, NULL);
953 service_destroy(svc_handle);
958 memset(bubble_data->backupPath, 0x00, sizeof(bubble_data->backupPath));
959 bubble_data->backup_type = BUBBLE_BACKUP_TYPE_NONE;
960 bubble_data->backup_cancel = false;
964 static void __backup_thread_cancel_clicked_cb(void *data, Evas_Object *obj, void *event_info)
966 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
967 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
968 bubble_data->backup_cancel = true;
970 if (bubble_data->popup) {
971 evas_object_del(bubble_data->popup);
972 bubble_data->popup = NULL;
976 static void __msg_ui_bubble_backup_menu_selected_cb(void *data, Evas_Object *obj, void *event_info)
978 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
979 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
981 const char *label = elm_object_item_text_get((Elm_Object_Item *) event_info);
984 if (bubble_data->popup) {
985 evas_object_del(bubble_data->popup);
986 bubble_data->popup = NULL;
989 Evas_Object *popup = elm_popup_add(cd->main_window);
991 elm_object_text_set(popup, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_IN_PROGRESS_ING"));
993 Evas_Object *cancel_btn = elm_button_add(popup);
994 elm_object_style_set(cancel_btn, "popup_button/default");
995 elm_object_text_set(cancel_btn, dgettext("sys_string", "IDS_COM_SK_CANCEL"));
996 elm_object_part_content_set(popup, "button1", cancel_btn);
997 evas_object_smart_callback_add(cancel_btn, "clicked", __backup_thread_cancel_clicked_cb, bubble_data);
999 bubble_data->popup = popup;
1000 evas_object_show(popup);
1002 if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSG_OPT_EXPORT_TO_SD_CARD")) == 0) {
1003 bubble_data->backup_type = BUBBLE_BACKUP_TYPE_SD;
1004 } else if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_OPT_SEND_VIA_EMAIL")) == 0) {
1005 bubble_data->backup_type = BUBBLE_BACKUP_TYPE_EMAIL;
1007 D_EMSG("invalid label text");
1011 bubble_data->backup_thread = ecore_thread_run(__backup_thread_fn, __backup_thread_end_fn, NULL, (void *)bubble_data);
1015 void msg_ui_bubble_backup_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1018 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1020 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)data;
1021 PMSG_BUBBLE_DATA bubble_data = cd->bubble_data;
1022 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !bubble_data);
1024 if (cd->ctx_popup) {
1025 evas_object_del(cd->ctx_popup);
1026 cd->ctx_popup = NULL;
1029 Evas_Object *popup = elm_popup_add(cd->main_window);
1030 elm_object_style_set(popup, "min_menustyle");
1031 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1033 Evas_Object *btn_close = elm_button_add(popup);
1034 elm_object_style_set(btn_close, "popup_button/default");
1035 elm_object_text_set(btn_close, dgettext("sys_string", "IDS_COM_BODY_CLOSE"));
1036 elm_object_part_content_set(popup, "button1", btn_close);
1037 evas_object_smart_callback_add(btn_close, "clicked", msg_ui_popup_close_clicked_cb, bubble_data);
1039 Evas_Object *list = elm_list_add(popup);
1040 elm_list_mode_set(list, ELM_LIST_EXPAND);
1042 evas_object_data_set(list, "bubble_data", bubble_data);
1044 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSG_OPT_EXPORT_TO_SD_CARD"), NULL, NULL, __msg_ui_bubble_backup_menu_selected_cb, (void *)bubble_data);
1045 elm_list_item_append(list, dgettext("sys_string", "IDS_COM_OPT_SEND_VIA_EMAIL"), NULL, NULL, __msg_ui_bubble_backup_menu_selected_cb, (void *)bubble_data);
1048 elm_object_content_set(popup, list);
1049 evas_object_show(popup);
1051 bubble_data->popup = popup;
1055 void msg_ui_bubble_more_delete_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1058 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1060 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)data;
1061 PMSG_BUBBLE_DATA bubble_data = cd->bubble_data;
1063 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !bubble_data);
1065 bubble_data->viewmode = BUBBLE_EDIT_VIEW;
1066 bubble_data->check_cnt = 0;
1067 bubble_data->del_index = 0;
1069 msg_ui_composer_editable_set(cd, EINA_FALSE);
1071 elm_object_part_content_unset(cd->navi_title_layout, "prev_btn");
1072 elm_object_part_content_unset(cd->navi_title_layout, "more_btn");
1073 elm_object_part_content_unset(cd->navi_title_layout, "compose_btn");
1076 evas_object_hide(cd->back_btn);
1079 evas_object_hide(cd->more_btn);
1081 if (cd->compose_btn)
1082 evas_object_hide(cd->compose_btn);
1084 if (cd->ctx_popup) {
1085 evas_object_del(cd->ctx_popup);
1086 cd->ctx_popup = NULL;
1090 PMSG_APP_CONV_DATA_S item_data = NULL;
1091 EINA_LIST_FOREACH(bubble_data->realized_list, l, item_data) {
1093 Evas_Object *check = NULL;
1094 if (!item_data->chk) {
1095 check = elm_check_add(item_data->ly);
1096 elm_check_state_pointer_set(check, &item_data->isCheck);
1097 evas_object_data_set(check, "item_data", (const void *)item_data);
1098 evas_object_smart_callback_add(check, "changed", msg_ui_bubble_list_checked_cb, (const void *)bubble_data);
1099 evas_object_propagate_events_set(check, EINA_FALSE);
1100 item_data->chk = check;
1102 evas_object_data_set(item_data->ly, "bubble_data", bubble_data);
1103 evas_object_event_callback_add(item_data->ly, EVAS_CALLBACK_MOUSE_DOWN, msg_ui_bubble_item_mouse_down_cb, (const void*)item_data);
1104 elm_object_style_set(check, "default/genlist_edit");
1105 elm_object_part_content_set(item_data->ly, "elm.swallow.select_icon", item_data->chk);
1106 elm_object_signal_emit(item_data->ly, "elm,state,select,enable", "elm");
1110 _bubble_change_edit_mode_title(bubble_data);
1111 _bubble_add_edit_controlbar(bubble_data);
1112 _bubble_add_navi_select_all_ly(bubble_data);
1115 void msg_ui_bubble_ctlbar_email_cb(void *data, Evas_Object *obj, void *event_info)
1119 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1120 MSG_COMPOSER_VIEW_DATA_S *cd = data;
1121 PMSG_BUBBLE_DATA pData = cd->bubble_data;
1122 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData);
1124 msg_ui_bubble_close_title_menu_genlist(pData);
1126 if (pData->addr_list.addr_cnt == 1) {
1127 service_h svc_handle;
1128 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
1129 D_EMSG("service_create() is failed !!");
1131 service_set_operation(svc_handle, SERVICE_OPERATION_SEND);
1132 service_set_app_id(svc_handle, "email-composer-efl");
1133 service_add_extra_data(svc_handle, "RUN_TYPE","5");
1135 Ecore_X_Window win_id = elm_win_xwindow_get(cd->main_window);
1137 service_set_window(svc_handle, win_id);
1138 service_add_extra_data(svc_handle, SERVICE_DATA_TO, pData->addr_list.addr_info[0].address);
1140 service_send_launch_request(svc_handle, NULL, NULL);
1142 service_destroy(svc_handle);
1147 void msg_ui_bubble_ctlbar_call_cb(void *data, Evas_Object *obj, void *event_info)
1150 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1151 MSG_COMPOSER_VIEW_DATA_S *cd = data;
1152 PMSG_BUBBLE_DATA pData = (PMSG_BUBBLE_DATA)cd->bubble_data;
1153 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData);
1155 if (pData->addr_list.addr_cnt == 1)
1156 msg_ui_bubble_launch_voice_call(pData->addr_list.addr_info[0].address);
1158 msg_ui_bubble_close_title_menu_genlist(pData);
1161 void msg_ui_bubble_ctlbar_vcall_cb(void *data, Evas_Object *obj, void *event_info)
1164 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1165 MSG_COMPOSER_VIEW_DATA_S *cd = data;
1166 PMSG_BUBBLE_DATA pData = cd->bubble_data;
1167 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData);
1169 if (pData->addr_list.addr_cnt == 1)
1170 msg_ui_bubble_launch_video_call(pData->addr_list.addr_info[0].address);
1172 msg_ui_bubble_close_title_menu_genlist(pData);
1175 void msg_ui_bubble_ctlbar_add_to_contact_cb(void *data, Evas_Object *obj, void *event_info)
1178 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1179 MSG_COMPOSER_VIEW_DATA_S *cd = data;
1181 PMSG_BUBBLE_DATA pData = cd->bubble_data;
1182 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData);
1184 if (pData->addr_list.addr_cnt == 1)
1185 msg_ui_composer_launch_contact_list_ug(cd, MSG_CT_UG_REQUEST_UPDATE_WITH_NUM, pData->addr_list.addr_info[0].address);
1187 msg_ui_bubble_close_title_menu_genlist(pData);
1190 void msg_ui_bubble_ctlbar_view_ct_detail_cb(void *data, Evas_Object *obj, void *event_info)
1193 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1195 MSG_COMPOSER_VIEW_DATA_S *cd = data;
1197 PMSG_BUBBLE_DATA pData = cd->bubble_data;
1198 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData);
1200 if (pData->addr_list.addr_cnt == 1)
1201 msg_ui_composer_launch_contact_detail_ug(cd, pData->addr_list.addr_info[0].contact_id);
1203 msg_ui_bubble_close_title_menu_genlist(pData);
1206 void msg_ui_bubble_ctlbar_block_cb(void *data, Evas_Object *obj, void *event_info)
1209 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1211 PMSG_BUBBLE_DATA pData = (PMSG_BUBBLE_DATA)data;
1213 __msg_ui_bubble_create_block_popup(pData, pData->addr_list.addr_info[0].address);
1215 msg_ui_bubble_close_title_menu_genlist(pData);
1218 void msg_ui_bubble_ctlbar_unblock_cb(void *data, Evas_Object *obj, void *event_info)
1221 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1223 PMSG_BUBBLE_DATA pData = data;
1225 __msg_ui_bubble_unblock(pData, pData->addr_list.addr_info[0].address);
1227 msg_ui_bubble_close_title_menu_genlist(pData);
1230 void msg_ui_bubble_ctlbar_delete_cb(void *data, Evas_Object *obj, void *event_info)
1233 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1234 MSG_COMPOSER_VIEW_DATA_S *cd = data;
1235 PMSG_BUBBLE_DATA pData = cd->bubble_data;
1236 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData);
1237 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, pData->del_thread);
1240 evas_object_del(pData->popup);
1241 pData->popup = NULL;
1244 bool isDraft = msg_ui_composer_common_is_send_possible(cd);
1246 if (pData->sel_all_checked && isDraft == false) {
1247 pData->bubble_count = 0;
1248 _del_all_item(pData);
1250 pData->popup = msg_ui_bubble_show_notify_with_progressbar(pData, pData->check_cnt);
1251 pData->del_thread = ecore_thread_feedback_run(_del_thread_fn, _del_thread_feedback_fn, NULL, NULL, (void *)pData, EINA_TRUE);
1256 void msg_ui_bubble_ctlbar_cancel_cb(void *data, Evas_Object *obj, void *event_info)
1259 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1260 MSG_COMPOSER_VIEW_DATA_S *cd = data;
1261 PMSG_BUBBLE_DATA pData = cd->bubble_data;
1262 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pData);
1264 _bubble_show_normal_mode(data);
1266 if (pData->added_list)
1267 pData->add_animator = ecore_animator_add(msg_ui_bubble_item_add_cb, (const void *) pData);
1269 msg_ui_composer_last_focus_load(cd);
1272 void msg_ui_bubble_sel_all_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1276 PMSG_BUBBLE_DATA pData = (PMSG_BUBBLE_DATA) data;
1277 PMSG_APP_CONV_DATA_S item_data = NULL;
1279 D_MSG("pData->sel_all_checked = %d", pData->sel_all_checked);
1281 if (pData->sel_all_checked) {
1282 pData->check_cnt = pData->bubble_count;
1283 pData->chk_list = eina_list_clone(pData->bubble_list);
1285 pData->check_cnt = 0;
1286 pData->chk_list = eina_list_free(pData->chk_list);
1290 EINA_LIST_FOREACH(pData->bubble_list, l, item_data) {
1292 item_data->isCheck = pData->sel_all_checked;
1296 EINA_LIST_FOREACH(pData->realized_list, l, item_data) {
1298 elm_check_state_set(item_data->chk, item_data->isCheck);
1302 msg_ui_bubble_show_select_info(pData);
1307 void msg_ui_bubble_item_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1309 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !event_info);
1312 Evas_Event_Mouse_Down *ev = event_info;
1314 PMSG_APP_CONV_DATA_S item_data = (PMSG_APP_CONV_DATA_S)data;
1315 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)evas_object_data_get(item_data->ly, "bubble_data");
1320 if (abs(x - g_mouse_down_x) > 20 || abs(y - g_mouse_down_y) > 20) {
1321 goto RESET_EVAS_COORD;
1324 if (elm_check_state_get(item_data->chk) == EINA_TRUE)
1325 elm_check_state_set(item_data->chk, EINA_FALSE);
1327 elm_check_state_set(item_data->chk, EINA_TRUE);
1329 msg_ui_bubble_list_checked_cb((void *)bubble_data, item_data->chk, NULL);
1332 evas_object_event_callback_del(item_data->ly, EVAS_CALLBACK_MOUSE_UP, msg_ui_bubble_item_mouse_up_cb);
1337 void msg_ui_bubble_item_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1339 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !event_info);
1341 PMSG_APP_CONV_DATA_S item_data = (PMSG_APP_CONV_DATA_S)data;
1343 Evas_Event_Mouse_Down *ev = event_info;
1345 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
1348 g_mouse_down_x = ev->canvas.x;
1349 g_mouse_down_y = ev->canvas.y;
1351 evas_object_event_callback_add(item_data->ly, EVAS_CALLBACK_MOUSE_UP, msg_ui_bubble_item_mouse_up_cb, (const void*)item_data);
1354 #ifdef _BUBBLE_FLICK_EVENT
1355 void msg_ui_bubble_layout_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1357 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1358 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !event_info);
1360 Evas_Coord x, y, w, h;
1361 Evas_Event_Mouse_Down *ev = event_info;
1371 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1372 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
1374 evas_object_geometry_get(bubble_data->bubble_layout, &x, &y, &w, &h);
1376 rotate = elm_win_rotation_get(cd->main_window);
1378 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "PORTRAIT mode");
1379 start_x = bubble_data->m_x;
1380 end_x = ev->canvas.x;
1381 start_y = bubble_data->m_y;
1382 end_y = ev->canvas.y;
1384 } else if (rotate == 180) {
1385 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "PORTRAIT reverse mode");
1386 start_x = ev->canvas.x;
1387 end_x = bubble_data->m_x;
1388 start_y = bubble_data->m_y;
1389 end_y = ev->canvas.y;
1391 } else if (rotate == 90) {
1392 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "LANDSCAPE mode");
1393 start_x = ev->canvas.y;
1394 end_x = bubble_data->m_y;
1395 start_y = bubble_data->m_x;
1396 end_y = ev->canvas.x;
1398 } else if (rotate== 270) {
1399 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "LANDSCAPE reverse mode");
1400 start_x = bubble_data->m_y;
1401 end_x = ev->canvas.y;
1402 start_y = bubble_data->m_x;
1403 end_y = ev->canvas.x;
1406 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Invalid rotation value");
1407 evas_object_event_callback_del(bubble_data->bubble_layout, EVAS_CALLBACK_MOUSE_UP, msg_ui_bubble_layout_mouse_up_cb);
1411 move_x = abs(start_x - end_x);
1412 move_y = abs(start_y - end_y);
1414 if (move_x > move_y) {
1415 if (move_x > (width / 3)) { // It should be moved over 1/3 of the screen width to show next/previous converstaions.
1418 msg_struct_list_s peerList = {0,};
1419 msg_struct_t sortRule = NULL;
1420 msg_struct_list_s addrList = {0,};
1422 sortRule = msg_create_struct(MSG_STRUCT_SORT_RULE);
1423 msg_set_int_value(sortRule, MSG_SORT_RULE_SORT_TYPE_INT, MSG_SORT_BY_THREAD_DATE);
1424 msg_set_bool_value(sortRule, MSG_SORT_RULE_ACSCEND_BOOL, false);
1426 msg_get_thread_view_list(cd->msg_handle, sortRule, &peerList);
1427 msg_release_struct(&sortRule);
1429 for (row=0; row < peerList.nCount; row++) {
1431 msg_get_int_value(peerList.msg_struct_info[row], MSG_THREAD_ID_INT, &thread_id);
1433 if (bubble_data->threadId == thread_id) {
1434 msg_ui_bubble_init_bubble_list(bubble_data);
1435 if (start_x > end_x) // show next
1436 selected = row+1 < peerList.nCount ? row+1 : 0;
1437 else // show previous
1438 selected = row-1 < 0 ? peerList.nCount-1 : row-1;
1440 int selecte_thread_id = 0;
1441 msg_get_int_value(peerList.msg_struct_info[selected], MSG_THREAD_ID_INT, &selecte_thread_id);
1442 bubble_data->threadId = selecte_thread_id;
1444 msg_get_address_list(bubble_data->msgHandle, bubble_data->threadId, &addrList);
1446 bubble_data->addr_list.addr_cnt = addrList.nCount;
1449 /* clear recipient_list of bubble composer */
1450 msg_ui_composer_recipient_clear_recipient_list(cd);
1452 for (i=0; i < addrList.nCount; i++) {
1455 msg_get_str_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, bubble_data->addr_list.addr_info[i].address, DEF_THREAD_ADDR_LEN);
1456 msg_get_int_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_CONTACT_ID_INT, &contact_id);
1458 if (contact_id > 0) {
1459 bubble_data->addr_list.addr_info[i].contact_id = contact_id;
1460 msg_get_str_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_DISPLAYNAME_STR, bubble_data->addr_list.addr_info[i].name, DEF_THREAD_NAME_LEN);
1462 bubble_data->addr_list.addr_info[i].contact_id = 0;
1465 /* set recipient_list for bubble composer */
1466 msg_ui_composer_recipient_add_recipient_list(cd, addrList.addrInfo[i].addressVal);
1469 // bubble list update
1470 msg_ui_bubble_list_load(bubble_data);
1471 msg_ui_composer_navi_title_set((void *)cd);
1472 service_h svc_handle;
1473 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
1474 D_EMSG("service_create() is failed !!");
1476 char buf[DEF_BUF_LEN_S] = {0,};
1477 snprintf(buf, DEF_BUF_LEN_L, "%d", bubble_data->threadId);
1478 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_THREAD_ID, buf);
1480 ug_send_result(cd->ug, svc_handle);
1482 service_destroy(svc_handle);
1485 msg_release_list_struct(&addrList);
1490 msg_release_list_struct(&peerList);
1493 evas_object_event_callback_del(bubble_data->bubble_layout, EVAS_CALLBACK_MOUSE_UP, msg_ui_bubble_layout_mouse_up_cb);
1496 void msg_ui_bubble_layout_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1500 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
1501 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1503 Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *)event_info;
1505 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
1508 bubble_data->m_x = ev->canvas.x;
1509 bubble_data->m_y = ev->canvas.y;
1511 evas_object_event_callback_add(bubble_data->bubble_layout, EVAS_CALLBACK_MOUSE_UP, msg_ui_bubble_layout_mouse_up_cb, (const void*)bubble_data);
1515 void msg_ui_bubble_list_checked_cb(void *data, Evas_Object *obj, void *event_info)
1519 PMSG_BUBBLE_DATA pData = (PMSG_BUBBLE_DATA) data;
1520 PMSG_APP_CONV_DATA_S item_data = NULL;
1522 item_data = evas_object_data_get(obj, "item_data");
1524 if (item_data->isCheck) {
1526 if (!eina_list_data_find(pData->chk_list, item_data))
1527 pData->chk_list = eina_list_append(pData->chk_list, item_data);
1530 pData->chk_list = eina_list_remove(pData->chk_list, item_data);
1533 if (pData->bubble_count == pData->check_cnt)
1534 elm_check_state_set(pData->sel_all_box, EINA_TRUE);
1536 elm_check_state_set(pData->sel_all_box, EINA_FALSE);
1538 msg_ui_bubble_show_select_info(pData);
1543 void msg_ui_bubble_timezone_change_cb(keynode_t *key, void *data)
1547 PMSG_BUBBLE_DATA BubbleData = (PMSG_BUBBLE_DATA)data;
1549 char *timezone_id = NULL;
1550 UChar utimezone_id[DEF_BUF_LEN] = {0,};
1551 UErrorCode status = U_ZERO_ERROR;
1553 timezone_id = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID);
1558 u_uastrcpy(utimezone_id, timezone_id);
1560 ucal_setDefaultTimeZone(utimezone_id, &status);
1562 if (U_FAILURE(status))
1565 msg_ui_bubble_get_locale(BubbleData);
1566 msg_ui_bubble_get_time_format(BubbleData);
1568 if (BubbleData->date_ptn_default) {
1569 free(BubbleData->date_ptn_default);
1570 BubbleData->date_ptn_default = NULL;
1573 if (BubbleData->date_ptn_year) {
1574 free(BubbleData->date_ptn_year);
1575 BubbleData->date_ptn_year = NULL;
1578 if (BubbleData->time_12h_ptn) {
1579 free(BubbleData->time_12h_ptn);
1580 BubbleData->time_12h_ptn = NULL;
1583 if (BubbleData->time_24h_ptn) {
1584 free(BubbleData->time_24h_ptn);
1585 BubbleData->time_24h_ptn = NULL;
1588 BubbleData->time_12h_ptn = msg_common_get_date_best_pattern(BubbleData->locale, MSG_UI_TIME_PATTERN_12H);
1589 BubbleData->time_24h_ptn = msg_common_get_date_best_pattern(BubbleData->locale, MSG_UI_TIME_PATTERN_24H);
1590 BubbleData->date_ptn_default = msg_common_get_date_best_pattern(BubbleData->locale, MSG_UI_DATE_PATTERN_DEFAULT);
1591 BubbleData->date_ptn_year = msg_common_get_date_best_pattern(BubbleData->locale, MSG_UI_DATE_PATTERN_YEAR);
1593 msg_ui_bubble_list_data_update(BubbleData);
1598 void msg_ui_bubble_scroll_edge_top_cb(void *data, Evas_Object *obj, void *event_info)
1602 PMSG_BUBBLE_DATA pData = (PMSG_BUBBLE_DATA)data;
1604 evas_object_smart_callback_del(obj, "scroll,drag,start", msg_ui_bubble_scroll_drag_start_cb);
1606 if (!pData->load_animator)
1607 pData->load_animator = ecore_animator_add(msg_ui_bubble_item_load_cb, data);
1612 void msg_ui_bubble_scroll_drag_start_cb(void *data, Evas_Object *obj, void *event_info)
1616 PMSG_BUBBLE_DATA pData = (PMSG_BUBBLE_DATA)data;
1618 evas_object_smart_callback_add(obj, "edge,top", msg_ui_bubble_scroll_edge_top_cb, (void *)pData);
1623 void msg_ui_bubble_anchor_menu_click_cb(void *data, Evas_Object *obj, void *event_info)
1626 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1627 MSG_COMPOSER_VIEW_DATA_S *cd = data;
1628 PMSG_BUBBLE_DATA bubble_data = cd->bubble_data;
1629 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !bubble_data);
1631 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
1632 elm_list_item_selected_set(item, 0);
1634 const char *label = elm_object_item_text_get(item);
1635 const char *title = elm_object_part_text_get(bubble_data->popup, "title,text");
1637 if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_BODY_CALL")) == 0) {
1638 msg_ui_bubble_launch_voice_call(title);
1639 } else if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_BODY_SEND_MESSAGE")) == 0) {
1640 service_h svc_handle;
1641 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
1642 D_EMSG("service_create() is failed !!");
1644 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TO, title);
1645 msg_ui_composer_launch_composer_create(cd, svc_handle);
1647 msg_ui_bubble_show_notify(bubble_data, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_UNABLE_TO_OPEN"));
1649 service_destroy(svc_handle);
1652 } else if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_BODY_VIDEO_CALL")) == 0) {
1653 msg_ui_bubble_launch_video_call(title);
1654 } else if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_OPT_ADD_TO_CONTACTS")) == 0) { /* Add to contact with phone number string... */
1655 msg_ui_composer_launch_contact_list_ug(cd, MSG_CT_UG_REQUEST_UPDATE_WITH_NUM, title);
1656 } else if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGC_OPT_VIEW_CONTACT")) == 0) {
1657 msg_ui_composer_launch_contact_detail_ug(cd, bubble_data->addr_list.addr_info[0].contact_id);
1658 } else if (g_strcmp0(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_SEND_EMAIL")) == 0) {
1659 service_h svc_handle;
1660 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
1661 D_EMSG("service_create() is failed !!");
1663 service_set_operation(svc_handle, SERVICE_OPERATION_SEND);
1664 service_set_app_id(svc_handle, "email-composer-efl");
1665 service_add_extra_data(svc_handle, "RUN_TYPE","5");
1667 Ecore_X_Window win_id = elm_win_xwindow_get(cd->main_window);
1669 service_set_window(svc_handle, win_id);
1670 service_add_extra_data(svc_handle, SERVICE_DATA_TO, title);
1672 service_send_launch_request(svc_handle, NULL, NULL);
1674 service_destroy(svc_handle);
1678 if (bubble_data->popup) {
1679 evas_object_del(bubble_data->popup);
1680 bubble_data->popup = NULL;
1686 void msg_ui_bubble_main_layout_clicked_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1689 D_MSG_RETM_IF(data == NULL, "data is NULL");
1690 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)data;
1692 if (!cd->is_keypad_show)
1693 msg_ui_composer_make_default_body_size(cd);
1695 cd->make_default_body_size = true;