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"
19 #include "msg-ui-composer-external.h"
20 #include "msg-ui-composer-main.h"
21 #include "msg-ui-composer-message.h"
22 #include "msg-ui-composer-common.h"
23 #include "syspopup_caller.h"
25 bool g_isFirstLoading = true;
27 #define MSG_BUBBLE_IMAGE_DRM_ICON IMGDIR"/M01_icon_DRM_64x64.png"
29 #define MSG_BUBBLE_BLOCK_COUNT (20)
31 static void __anchor_click_cb(void *data, Evas_Object *obj, void *event_info);
32 static void __longpressed_cb(void *data, Evas_Object *obj, void *event_info);
34 static char *__msg_ui_get_display_time(time_t *msg_t, PMSG_BUBBLE_DATA bubble_data)
36 if (!msg_t || !bubble_data)
39 char buf[DEF_BUF_LEN] = { 0 };
40 char *str_time = NULL;
42 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, !bubble_data, NULL);
44 if (bubble_data->time_fmt == MSG_TIME_FORMAT_24H)
45 str_time = msg_common_get_formatted_date(bubble_data->locale, bubble_data->time_24h_ptn, msg_t);
47 str_time = msg_common_get_formatted_date(bubble_data->locale, bubble_data->time_12h_ptn, msg_t); /* MSG_TIME_FORMAT_12H */
49 snprintf(buf, sizeof(buf), "%s", str_time);
58 static void __msg_bubble_add_content(PMSG_BUBBLE_DATA bubble_data, PMSG_APP_CONV_DATA_S conv_data)
60 bool isMsgText = false;
61 Eina_Strbuf *msg_data = eina_strbuf_new();
63 if (conv_data->msgText[0] != '\0')
67 if ((conv_data->msgType == MSG_TYPE_MMS || conv_data->msgType == MSG_TYPE_MMS_NOTI)) {
68 if (conv_data->subject[0] != '\0') {
70 eina_strbuf_append(msg_data, "<color=#050288FF>");
72 subject = elm_entry_utf8_to_markup(conv_data->subject);
73 eina_strbuf_append(msg_data, subject);
77 eina_strbuf_append(msg_data, "</color><br>");
80 if (conv_data->thumbNailPath[0] != '\0') {
81 Evas_Object *tmp_obj = NULL;
87 tmp_obj = evas_object_image_filled_add(evas_object_evas_get(conv_data->entry));
88 evas_object_image_file_set(tmp_obj, conv_data->thumbNailPath, NULL);
89 evas_object_image_size_get(tmp_obj, &w, &h);
91 evas_object_del(tmp_obj);
94 rate = MSG_BUBBLE_IMG_MAX_W / (double) w;
95 w = MSG_BUBBLE_IMG_MAX_W;
98 rate = MSG_BUBBLE_IMG_MAX_H / (double)h;
100 h = MSG_BUBBLE_IMG_MAX_H;
103 /* Don't remove <br> between <item> and </item>. if it is removed, anchor wouldn't work */
104 /* In case of body text is not exist, <br> should not be shown. for this, change font size to 1*/
105 if (!isMsgText && conv_data->attachment_cnt == 0 && conv_data->audio_filename[0] == '\0')
106 eina_strbuf_append(msg_data, "<font_size=1>");
107 eina_strbuf_append_printf(msg_data, "<a href=image.%d>", conv_data->msgId);
108 eina_strbuf_append_printf(msg_data, "<item size=%dx%d vsize=full href=file://%s><br></item></a>", w, h, conv_data->thumbNailPath);
112 if (conv_data->bProtected)
113 eina_strbuf_append_printf(msg_data, "<item size=44x44 vsize=full href=file://%s></item>", MSG_BUBBLE_PROTECTED_ICON);
116 char *tmp_str = elm_entry_utf8_to_markup(conv_data->msgText);
117 eina_strbuf_append(msg_data, tmp_str);
121 if (conv_data->msgType == MSG_TYPE_MMS) {
123 if (conv_data->audio_filename[0] != '\0') {
126 eina_strbuf_append(msg_data, "<br>");
128 eina_strbuf_append_printf(msg_data, "<a href=audio.%d>", conv_data->msgId);
129 eina_strbuf_append_printf(msg_data, "<item size=42x42 vsize=full href=file://%s> %s</item></a>", MSG_BUBBLE_AUDIOFILE_ICON, conv_data->audio_filename);
131 /** attachment files*/
132 if (conv_data->attachment_cnt > 0) {
133 char attach_str[DEF_BUF_LEN] = {0,};
134 if (conv_data->attachment_cnt == 1 && conv_data->attachment_filename[0] != '\0') {
135 snprintf(attach_str, sizeof(attach_str), "%s", conv_data->attachment_filename);
137 const char *text = dgettext(MESSAGE_PKGNAME, "IDS_MSGC_BODY_PD_ATTACHMENTS");
138 snprintf(attach_str, sizeof(attach_str), text, conv_data->attachment_cnt);
141 if (isMsgText || conv_data->audio_filename[0] != '\0')
142 eina_strbuf_append(msg_data, "<br>");
144 eina_strbuf_append_printf(msg_data, "<item size=42x42 vsize=full href=file://%s> %s</item>", MSG_BUBBLE_ATTACH_ICON, attach_str);
146 } else if (conv_data->msgType == MSG_TYPE_SMS && conv_data->storageId == MSG_STORAGE_SIM) {
148 eina_strbuf_append(msg_data, "<font_size=24>");
149 eina_strbuf_append(msg_data, "<br>");
152 eina_strbuf_append_printf(msg_data, "<item size=34x34 vsize=full href=file://%s></item>", MSG_BUBBLE_SIM_MSG_ICON);
155 elm_entry_entry_set(conv_data->entry, eina_strbuf_string_get(msg_data));
156 eina_strbuf_free(msg_data);
159 static void __add_bubble_item(PMSG_BUBBLE_DATA bubble_data, PMSG_APP_CONV_DATA_S conv_data, MsgBoxPackType type, Evas_Object *obj)
161 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !bubble_data || !conv_data);
162 if (type == MSG_BOX_PACK_BEFORE || type == MSG_BOX_PACK_AFTER) {
163 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !obj);
165 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
167 Evas_Object *layout = elm_layout_add(bubble_data->box);
168 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
169 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
171 Evas_Object *entry = elm_entry_add(bubble_data->box);
173 if (conv_data->direction == MSG_DIRECTION_TYPE_MO) {
174 elm_layout_theme_set(layout, "layout", "bubble", "sentmessage/default");
175 elm_object_theme_set(entry, cd->th);
176 elm_object_style_set(entry, MSG_BUBBLE_STYLE_SENT);
178 elm_layout_theme_set(layout, "layout", "bubble", "readmessage/default");
179 elm_object_theme_set(entry, cd->th);
180 elm_object_style_set(entry, MSG_BUBBLE_STYLE_RECV);
183 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
184 elm_entry_editable_set(entry, EINA_FALSE);
185 elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_NO_IMAGE);
186 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
187 elm_entry_magnifier_disabled_set(entry, EINA_TRUE);
189 conv_data->entry = entry;
190 conv_data->ly = layout;
192 msg_ui_bubble_fill_bubble_contents(bubble_data, conv_data);
194 evas_object_data_set(entry, "conv_data", conv_data);
196 evas_object_smart_callback_add(entry, "anchor,clicked", __anchor_click_cb, (const void*)bubble_data);
197 evas_object_smart_callback_add(entry, "longpressed", __longpressed_cb, (const void*)bubble_data);
199 elm_object_part_content_set(layout, "elm.icon", entry);
200 evas_object_show(layout);
203 case MSG_BOX_PACK_START :
204 elm_box_pack_start(bubble_data->box, layout);
206 case MSG_BOX_PACK_END :
207 elm_box_pack_end(bubble_data->box, layout);
209 case MSG_BOX_PACK_BEFORE :
210 elm_box_pack_before(bubble_data->box, layout, obj);
212 case MSG_BOX_PACK_AFTER :
213 elm_box_pack_after(bubble_data->box, layout, obj);
219 if (bubble_data->viewmode == BUBBLE_EDIT_VIEW) {
220 Evas_Object *check = NULL;
221 if (!conv_data->chk) {
222 check = elm_check_add(conv_data->ly);
223 elm_check_state_pointer_set(check, &conv_data->isCheck);
224 evas_object_data_set(check, "item_data", (const void *)conv_data);
225 evas_object_smart_callback_add(check, "changed", msg_ui_bubble_list_checked_cb, (const void *)bubble_data);
226 evas_object_propagate_events_set(check, EINA_FALSE);
227 conv_data->chk = check;
229 evas_object_data_set(conv_data->ly, "bubble_data", bubble_data);
230 evas_object_event_callback_add(conv_data->ly, EVAS_CALLBACK_MOUSE_DOWN, msg_ui_bubble_item_mouse_down_cb, (const void*)conv_data);
231 elm_object_style_set(check, "default/genlist_edit");
232 elm_object_part_content_set(conv_data->ly, "elm.swallow.select_icon", conv_data->chk);
233 elm_object_signal_emit(conv_data->ly, "elm,state,select,enable", "elm");
235 if (conv_data->isCheck) {
236 elm_check_state_set(conv_data->chk, conv_data->isCheck);
241 static void __msg_media_clicked_cb(PMSG_BUBBLE_DATA bubble_data, char *msgID, int file_type)
244 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !msgID);
246 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !bubble_data);
247 MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, bubble_data->viewmode != BUBBLE_NORMAL_VIEW, "Not Normal Mode!");
249 msg_error_t err = MSG_SUCCESS;
250 msg_struct_t msg_t = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
251 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
252 msg_struct_t mms_data = NULL;
253 msg_list_handle_t page_list = NULL;
254 msg_struct_t mms_page = NULL;
255 msg_struct_t mms_media = NULL;
256 char filepath[DEF_BUF_LEN_L+1] = {0,};
258 int msg_id = atoi(msgID);
263 err = msg_get_message(bubble_data->msgHandle, msg_id, msg_t, sendOpt);
264 if (err != MSG_SUCCESS) {
265 D_MSG("err = [%d]", err);
266 msg_release_struct(&msg_t);
267 msg_release_struct(&sendOpt);
271 mms_data = msg_create_struct(MSG_STRUCT_MMS);
272 err = msg_get_mms_struct(msg_t, mms_data);
273 if (err != MSG_SUCCESS) {
274 D_MSG("err = [%d]", err);
275 goto OUTSIDE_OF_LOOP;
278 msg_get_list_handle(mms_data, MSG_MMS_PAGE_LIST_HND, (void **)&page_list);
279 pageCnt = msg_list_length(page_list);
280 for (i = 0 ; i < pageCnt; i++) {
281 mms_page = (msg_struct_t)msg_list_nth_data(page_list, i);
282 msg_list_handle_t medialist = NULL;
285 msg_get_list_handle(mms_page, MSG_MMS_PAGE_MEDIA_LIST_HND, (void **)&medialist);
286 mediaCnt = msg_list_length(medialist);
288 for (j = 0; j < mediaCnt; j++) {
290 mms_media = (msg_struct_t)msg_list_nth_data(medialist, j);
292 msg_get_int_value(mms_media, MSG_MMS_MEDIA_TYPE_INT, &media_type);
294 if (media_type == file_type) {
295 goto OUTSIDE_OF_LOOP;
302 msg_get_str_value(mms_media, MSG_MMS_MEDIA_FILEPATH_STR, filepath, sizeof(filepath)-1);
304 if (mms_media && filepath[0] != '\0') {
305 service_h svc_handle;
306 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
307 D_EMSG("service_create() is failed !!");
309 service_set_operation(svc_handle, SERVICE_OPERATION_VIEW);
310 service_set_uri(svc_handle, filepath);
312 if (service_send_launch_request(svc_handle, NULL, NULL) < 0)
313 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "service_send_launch_request is failed");
315 service_destroy(svc_handle);
319 msg_release_struct(&mms_data);
320 msg_release_struct(&msg_t);
321 msg_release_struct(&sendOpt);
326 static void __msg_install_clicked_cb(PMSG_BUBBLE_DATA bubble_data, int msg_id)
329 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, bubble_data == NULL);
331 D_MSG("syncml message operation, msg id = [%d]", msg_id);
333 msg_error_t err = MSG_SUCCESS;
335 err = msg_syncml_message_operation(bubble_data->msgHandle, (msg_message_id_t) msg_id);
336 if (err != MSG_SUCCESS)
337 D_MSG("msg_syncml_message_operation failed.");
342 Eina_Bool __resend_idler_cb(void *data)
344 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
345 PMSG_APP_CONV_DATA_S conv_data = NULL;
347 msg_struct_t failed_msg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
348 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
349 msg_error_t err = MSG_SUCCESS;
350 int msg_type = MSG_TYPE_INVALID;
352 D_MSG("Re-send message, msg id = [%d]", bubble_data->resend_id);
354 err = msg_get_message(bubble_data->msgHandle, bubble_data->resend_id, failed_msg, sendOpt);
356 if (err != MSG_SUCCESS) {
357 D_MSG("msg_get_message is failed.");
358 msg_release_struct(&sendOpt);
359 msg_release_struct(&failed_msg);
360 bubble_data->resend_id = 0;
364 msg_struct_t req = msg_create_struct(MSG_STRUCT_REQUEST_INFO);
365 msg_set_struct_handle(req, MSG_REQUEST_MESSAGE_HND, failed_msg);
366 msg_set_struct_handle(req, MSG_REQUEST_SENDOPT_HND, sendOpt);
368 msg_get_int_value(failed_msg, MSG_MESSAGE_TYPE_INT, &msg_type);
370 if (msg_is_sms(msg_type))
371 err = msg_sms_send_message(bubble_data->msgHandle, req);
373 err = msg_mms_send_message(bubble_data->msgHandle, req);
375 if (err != MSG_SUCCESS) {
376 D_MSG("Send_message is failed.");
379 EINA_LIST_FOREACH(bubble_data->bubble_list, l, conv_data) {
381 if (bubble_data->resend_id == conv_data->msgId) {
382 conv_data->networkStatus = MSG_NETWORK_SEND_FAIL;
383 msg_ui_bubble_fill_bubble_contents(bubble_data, conv_data);
389 msg_ui_bubble_show_notify(bubble_data, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_DETAILSSENDINGFAILED"));
392 msg_release_struct(&failed_msg);
393 msg_release_struct(&sendOpt);
394 msg_release_struct(&req);
396 bubble_data->resend_idler = NULL;
397 bubble_data->resend_id = 0;
402 void msg_ui_bubble_resend_msg(PMSG_BUBBLE_DATA bubble_data, int msg_id)
405 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, bubble_data == NULL);
406 PMSG_APP_CONV_DATA_S conv_data = NULL;
409 EINA_LIST_FOREACH(bubble_data->bubble_list, l, conv_data) {
411 if (msg_id == conv_data->msgId) {
412 conv_data->networkStatus = MSG_NETWORK_SENDING;
413 msg_ui_bubble_fill_bubble_contents(bubble_data, conv_data);
414 elm_object_signal_emit(conv_data->ly, "elm,state,contents,disabled", "elm");
420 if (!bubble_data->resend_idler) {
421 bubble_data->resend_id = msg_id;
422 bubble_data->resend_idler = ecore_idler_add(__resend_idler_cb, (void *)bubble_data);
428 static Eina_Bool __retrieve_idler_cb(void *data)
430 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
432 msg_error_t err = MSG_SUCCESS;
433 PMSG_APP_CONV_DATA_S conv_data = NULL;
434 msg_struct_t retrieve_msg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
435 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
437 D_MSG("Retrieve mms message, msg id = [%d]", bubble_data->retrieve_id);
439 err = msg_get_message(bubble_data->msgHandle, bubble_data->retrieve_id, retrieve_msg, sendOpt);
440 if (err != MSG_SUCCESS) {
441 D_MSG("msg_get_message is failed.");
442 bubble_data->retrieve_id = 0;
443 msg_release_struct(&retrieve_msg);
444 msg_release_struct(&sendOpt);
448 msg_struct_t req = msg_create_struct(MSG_STRUCT_REQUEST_INFO);
449 msg_set_struct_handle(req, MSG_REQUEST_MESSAGE_HND, retrieve_msg);
450 msg_set_struct_handle(req, MSG_REQUEST_SENDOPT_HND, sendOpt);
452 err = msg_mms_retrieve_message(bubble_data->msgHandle, req);
454 if (err != MSG_SUCCESS) {
455 D_MSG("msg_mms_retrieve_message is failed.");
456 msg_ui_bubble_show_notify(bubble_data, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_RETRIEVING_FAILED"));
459 EINA_LIST_FOREACH(bubble_data->bubble_list, l, conv_data) {
460 if (conv_data && bubble_data->retrieve_id == conv_data->msgId) {
461 Evas_Object *retrieve_btn = elm_object_part_content_get(conv_data->entry, "elm.swallow.end");
464 elm_object_disabled_set(retrieve_btn, EINA_FALSE);
466 conv_data->networkStatus = MSG_NETWORK_RETRIEVE_FAIL;
467 msg_ui_bubble_fill_bubble_contents(bubble_data, conv_data);
473 msg_release_struct(&retrieve_msg);
474 msg_release_struct(&sendOpt);
475 msg_release_struct(&req);
477 bubble_data->retrieve_idler = NULL;
478 bubble_data->retrieve_id = 0;
483 static void __msg_retrieve_clicked_cb(PMSG_BUBBLE_DATA bubble_data, int msg_id)
486 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, bubble_data == NULL);
487 PMSG_APP_CONV_DATA_S conv_data = NULL;
490 EINA_LIST_FOREACH(bubble_data->bubble_list, l, conv_data) {
491 if (conv_data && msg_id == conv_data->msgId) {
492 Evas_Object *retrieve_btn = elm_object_part_content_get(conv_data->entry, "elm.swallow.end");
495 elm_object_disabled_set(retrieve_btn, EINA_TRUE);
497 conv_data->networkStatus = MSG_NETWORK_RETRIEVING;
498 msg_ui_bubble_fill_bubble_contents(bubble_data, conv_data);
503 if (!bubble_data->retrieve_idler) {
504 bubble_data->retrieve_id = msg_id;
505 bubble_data->retrieve_idler = ecore_idler_add(__retrieve_idler_cb, (void *)bubble_data);
511 static void __popup_close_clicked_cb(void *data, Evas_Object *obj, void *event_info)
513 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
515 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
517 if (bubble_data->popup) {
518 evas_object_del(bubble_data->popup);
519 bubble_data->popup = NULL;
523 static void __anchor_click_cb(void *data, Evas_Object *obj, void *event_info)
526 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj || !event_info);
528 PMSG_BUBBLE_DATA bubble_data = data;
529 Elm_Entry_Anchor_Info *ac_info = NULL;
531 if(bubble_data->viewmode != BUBBLE_NORMAL_VIEW)
534 /* Avoiding conflict long_press_menu popup */
535 if (bubble_data->popup)
538 char *token = NULL, *tok_r = NULL;
539 char type[DEF_BUF_LEN] = { 0, };
541 ac_info = (Elm_Entry_Anchor_Info *) event_info;
542 strncpy(type, ac_info->name, DEF_BUF_LEN - 1);
544 token = strtok_r(type, ".", &tok_r);
546 elm_entry_anchor_hover_end(obj);
548 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, tok_r == NULL);
550 if (g_strcmp0(token, "image") == 0)
551 __msg_media_clicked_cb(bubble_data, tok_r, MMS_SMIL_MEDIA_IMG);
552 else if (g_strcmp0(token, "audio") == 0)
553 __msg_media_clicked_cb(bubble_data, tok_r, MMS_SMIL_MEDIA_AUDIO);
558 static void __msg_copy_clicked_cb(void *data, Evas_Object *obj, void *event_info)
561 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
563 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
564 PMSG_APP_CONV_DATA_S conv_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
566 if (bubble_data->popup) {
567 evas_object_del(bubble_data->popup);
568 bubble_data->popup = NULL;
572 D_EMSG("conv_data is NULL");
576 char copy_str[DEF_BUF_LEN_L + DEF_BUF_LEN_S + 1] = {0,};
577 if (conv_data->subject[0] != '\0') {
578 strncat(copy_str, conv_data->subject, strlen(conv_data->subject));
579 strncat(copy_str, "\n", strlen("\n"));
582 if (conv_data->msgText[0] != '\0')
583 strncat(copy_str, conv_data->msgText, sizeof(copy_str) - strlen(conv_data->subject) - 1);
585 if (copy_str[0] != '\0')
586 elm_cnp_selection_set(conv_data->entry, ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT, copy_str, strlen(copy_str));
591 static void __msg_protect_clicked_cb(void *data, Evas_Object *obj, void *event_info)
594 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
596 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
597 PMSG_APP_CONV_DATA_S conv_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
599 if (bubble_data->popup) {
600 evas_object_del(bubble_data->popup);
601 bubble_data->popup = NULL;
604 if (msg_update_protected_status(bubble_data->msgHandle, conv_data->msgId, !conv_data->bProtected) == MSG_SUCCESS) {
605 conv_data->bProtected = !conv_data->bProtected;
606 msg_ui_bubble_fill_bubble_contents(bubble_data, conv_data);
610 static void __msg_delete_ok_clicked_cb(void *data, Evas_Object *obj, void *event_info)
613 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
615 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
616 PMSG_APP_CONV_DATA_S conv_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(bubble_data->popup, "conv_data");
617 msg_message_id_t msg_id;
620 if (bubble_data->popup) {
621 evas_object_del(bubble_data->popup);
622 bubble_data->popup = NULL;
626 msg_ui_bubble_show_notify(bubble_data, dgettext("sys_string", "IDS_COM_POP_UNABLE_TO_DELETE"));
630 bool isDraft = msg_ui_composer_common_is_send_possible((MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data);
632 if (bubble_data->bubble_count == 1 && isDraft == false) {
633 bubble_data->bubble_count = 0;
634 err = msg_delete_thread_message_list(bubble_data->msgHandle, bubble_data->threadId, false);
636 msg_id = conv_data->msgId;
637 err = msg_delete_message(bubble_data->msgHandle, msg_id);
638 msg_ui_bubble_list_load(bubble_data);
641 if (err != MSG_SUCCESS) {
642 msg_ui_bubble_show_notify(bubble_data, dgettext("sys_string", "IDS_COM_POP_UNABLE_TO_DELETE"));
644 msg_ui_bubble_show_deleted_info(bubble_data);
650 static void __msg_delete_clicked_cb(void *data, Evas_Object *obj, void *event_info)
654 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
656 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
657 PMSG_APP_CONV_DATA_S conv_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
658 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
660 if (bubble_data->popup) {
661 evas_object_del(bubble_data->popup);
662 bubble_data->popup = NULL;
666 D_EMSG("conv_data is NULL");
670 Evas_Object *popup = elm_popup_add(cd->main_window);
671 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
672 elm_object_text_set(popup, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_DELETE_Q"));
674 Evas_Object *btn_ok = elm_button_add(popup);
675 elm_object_style_set(btn_ok, "popup_button/default");
676 elm_object_text_set(btn_ok, dgettext("sys_string", "IDS_COM_SK_OK"));
677 elm_object_part_content_set(popup, "button1", btn_ok);
678 evas_object_smart_callback_add(btn_ok, "clicked", __msg_delete_ok_clicked_cb, bubble_data);
680 Evas_Object *btn_cancel = elm_button_add(popup);
681 elm_object_style_set(btn_cancel, "popup_button/default");
682 elm_object_text_set(btn_cancel, dgettext("sys_string", "IDS_COM_SK_CANCEL"));
683 elm_object_part_content_set(popup, "button2", btn_cancel);
684 evas_object_smart_callback_add(btn_cancel, "clicked", __popup_close_clicked_cb, bubble_data);
686 evas_object_data_set(popup, "conv_data", conv_data);
687 evas_object_show(popup);
689 bubble_data->popup = popup;
694 static int __msg_bubble_get_media_list(PMSG_BUBBLE_DATA bubble_data, PMSG_APP_CONV_DATA_S item_data)
698 PBUBBLE_MEDIA_INFO media_item = NULL;
699 msg_struct_t msgInfo = NULL;
700 msg_struct_t sendOpt = NULL;
701 msg_struct_t mmsInfo = NULL;
702 msg_list_handle_t pagelist = NULL;
703 msg_list_handle_t medialist = NULL;
704 msg_list_handle_t attachlist = NULL;
706 int attach_count = 0;
712 /**** getting msgInfo ***/
713 msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
714 sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
715 if (msg_get_message(bubble_data->msgHandle, item_data->msgId, msgInfo, sendOpt) != MSG_SUCCESS) {
716 D_EMSG("msg_get_message FAILED !!!");
717 msg_release_struct(&msgInfo);
718 msg_release_struct(&sendOpt);
722 /*** getting MMS info ****/
723 mmsInfo = msg_create_struct(MSG_STRUCT_MMS);
724 if (msg_get_mms_struct(msgInfo, mmsInfo) != MSG_SUCCESS) {
725 D_EMSG("msg_get_mms_struct FAILED !!!");
726 msg_release_struct(&msgInfo);
727 msg_release_struct(&sendOpt);
728 msg_release_struct(&mmsInfo);
732 msg_get_list_handle(mmsInfo, MSG_MMS_PAGE_LIST_HND, (void **)&pagelist);
733 page_count = msg_list_length(pagelist);
735 for (i=0; i<page_count; i++) {
736 msg_struct_t page_info = (msg_struct_t)msg_list_nth_data(pagelist, i);
737 int page_media_count = 0;
739 msg_get_list_handle(page_info, MSG_MMS_PAGE_MEDIA_LIST_HND, (void **)&medialist);
740 page_media_count = msg_list_length(medialist);
742 for (j = 0; j < page_media_count; j++) {
744 msg_struct_t media_info = NULL;
745 media_info = (msg_struct_t)msg_list_nth_data(medialist, j);
747 msg_get_int_value(media_info, MSG_MMS_MEDIA_TYPE_INT, &mediaType);
749 if (mediaType == MMS_SMIL_MEDIA_TEXT)
752 media_item = (PBUBBLE_MEDIA_INFO)calloc(1, sizeof(BUBBLE_MEDIA_INFO));
754 media_item->media_type = mediaType;
755 msg_get_str_value(media_info, MSG_MMS_MEDIA_FILEPATH_STR, media_item->filepath, sizeof(media_item->filepath));
756 msg_get_str_value(media_info, MSG_MMS_MEDIA_FILENAME_STR, media_item->filename, sizeof(media_item->filename));
757 media_item->file_size = (int)ecore_file_size(media_item->filepath) / 1024; // KB
759 bubble_data->media_list = eina_list_append(bubble_data->media_list, media_item);
766 /*** getting attachment info ***/
767 msg_get_list_handle(mmsInfo, MSG_MMS_ATTACH_LIST_HND, (void **)&attachlist);
768 attach_count = msg_list_length(attachlist);
770 for (i=0; i<attach_count; i++) {
771 msg_struct_t attach_info = (msg_struct_t)msg_list_nth_data(attachlist, i);
773 media_item = (PBUBBLE_MEDIA_INFO)calloc(1, sizeof(BUBBLE_MEDIA_INFO));
775 msg_get_int_value(attach_info, MSG_MMS_ATTACH_DRM_TYPE_INT, &media_item->drm_type);
776 msg_get_str_value(attach_info, MSG_MMS_ATTACH_FILEPATH_STR, media_item->filepath, sizeof(media_item->filepath));
777 msg_get_str_value(attach_info, MSG_MMS_ATTACH_FILENAME_STR, media_item->filename, sizeof(media_item->filename));
778 media_item->file_size = (int)ecore_file_size(media_item->filepath) / 1024; // KB
780 bubble_data->media_list = eina_list_append(bubble_data->media_list, media_item);
785 msg_release_struct(&msgInfo);
786 msg_release_struct(&sendOpt);
787 msg_release_struct(&mmsInfo);
793 void __msg_ui_bubble_save_attachments_checked_cb(void *data, Evas_Object *obj, void *event_info)
797 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
798 PBUBBLE_MEDIA_INFO mediaData = (PBUBBLE_MEDIA_INFO)evas_object_data_get(obj, "item_data");
799 Elm_Object_Item *it = NULL;
801 int genlist_count = elm_genlist_items_count(bubble_data->popup_genlist);
804 if (genlist_count == 1)
807 media_count = genlist_count - 1;
809 if (media_count == 1) {
810 if (mediaData->isChecked)
811 bubble_data->media_chk_cnt = 1;
813 bubble_data->media_chk_cnt = 0;
814 } else if (media_count > 1) {
815 it = elm_genlist_first_item_get(bubble_data->popup_genlist);
817 if (!strcmp(mediaData->filename, dgettext("sys_string", "IDS_COM_BODY_SELECT_ALL"))) {
819 PBUBBLE_MEDIA_INFO item_data = (PBUBBLE_MEDIA_INFO)elm_object_item_data_get(it);
821 item_data->isChecked = mediaData->isChecked;
822 elm_check_state_set(item_data->check, item_data->isChecked);
825 it = elm_genlist_item_next_get(it);
828 if (mediaData->isChecked)
829 bubble_data->media_chk_cnt = media_count;
831 bubble_data->media_chk_cnt = 0;
833 if (mediaData->isChecked) {
834 bubble_data->media_chk_cnt++;
836 if (bubble_data->media_chk_cnt == media_count) {
837 it = elm_genlist_first_item_get(bubble_data->popup_genlist);
838 PBUBBLE_MEDIA_INFO item_data = (PBUBBLE_MEDIA_INFO)elm_object_item_data_get(it);
840 item_data->isChecked = true;
841 elm_check_state_set(item_data->check, item_data->isChecked);
846 if (bubble_data->media_chk_cnt == media_count) {
847 it = elm_genlist_first_item_get(bubble_data->popup_genlist);
848 PBUBBLE_MEDIA_INFO item_data = (PBUBBLE_MEDIA_INFO)elm_object_item_data_get(it);
850 item_data->isChecked = false;
851 elm_check_state_set(item_data->check, item_data->isChecked);
854 bubble_data->media_chk_cnt--;
859 if (bubble_data->save_button) {
860 if (bubble_data->media_chk_cnt > 0)
861 elm_object_disabled_set(bubble_data->save_button, EINA_FALSE);
863 elm_object_disabled_set(bubble_data->save_button, EINA_TRUE);
870 static char *__msg_ui_bubble_save_attachments_gl_text_get(void *data, Evas_Object *obj, const char *part)
873 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL || obj == NULL, NULL);
875 PBUBBLE_MEDIA_INFO media_info = (PBUBBLE_MEDIA_INFO)data;
877 if (!strcmp(part, "elm.text")) {
878 return strdup(media_info->filename);
884 static Evas_Object *__msg_ui_bubble_save_attachments_gl_content_get(void *data, Evas_Object *obj, const char *part)
887 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL || obj == NULL, NULL);
889 PBUBBLE_MEDIA_INFO media_info = (PBUBBLE_MEDIA_INFO)data;
890 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)evas_object_data_get(obj, "bubble_data");
892 if (!strcmp(part, "elm.icon.1") || !strcmp(part, "elm.icon")) {
893 Evas_Object *check = elm_check_add(obj);
894 //set the State pointer to keep the current UI state of Checkbox.
895 elm_check_state_pointer_set(check, &media_info->isChecked);
896 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
897 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
899 media_info->check = check;
900 evas_object_data_set(check, "item_data", media_info);
902 evas_object_smart_callback_add(check, "changed", __msg_ui_bubble_save_attachments_checked_cb, bubble_data);
905 } else if (strcmp(part, "elm.icon.2") == 0) {
906 Evas_Object *image = elm_icon_add(obj);
908 if (media_info->drm_type != MSG_DRM_TYPE_NONE) {
909 elm_image_file_set(image, MSG_BUBBLE_IMAGE_DRM_ICON, NULL);
911 if (media_info->media_type == MMS_SMIL_MEDIA_IMG) {
912 if (media_info->filepath[0] != '\0')
913 elm_image_file_set(image, media_info->filepath, NULL);
915 elm_image_file_set(image, MSG_BUBBLE_ATTACH_ICON, NULL);
917 const char *icon_path = msg_common_get_file_icon(media_info->filepath);
919 elm_image_file_set(image, MSG_IMAGES_EDJ, icon_path);
921 D_EMSG("icon_path is NULL");
922 elm_image_file_set(image, MSG_IMAGES_EDJ, MSG_BUBBLE_ATTACH_ICON);
929 evas_object_size_hint_aspect_set(image, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
933 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Invalid part : %s", part);
940 static void __msg_ui_bubble_save_attachments_gl_sel(void *data, Evas_Object *obj, void *event_info)
943 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
945 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
947 PBUBBLE_MEDIA_INFO item_data = (PBUBBLE_MEDIA_INFO)elm_object_item_data_get(item);
949 elm_genlist_item_selected_set(item, false);
951 item_data->isChecked = !item_data->isChecked;
953 const char *filename = elm_object_item_part_text_get(item, "elm.text");
954 if (!strcmp(filename, dgettext("sys_string", "IDS_COM_BODY_SELECT_ALL")))
955 elm_genlist_item_fields_update(item, "elm.icon", ELM_GENLIST_ITEM_FIELD_CONTENT);
957 elm_genlist_item_fields_update(item, "elm.icon.1", ELM_GENLIST_ITEM_FIELD_CONTENT);
959 evas_object_smart_callback_call(item_data->check, "changed", event_info);
965 static void __popup_save_attachment_save_clicked_cb(void *data, Evas_Object *obj, void *event_info)
969 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
971 if (bubble_data->popup) {
972 evas_object_del(bubble_data->popup);
973 bubble_data->popup = NULL;
977 Eina_Bool ret = EINA_FALSE;
978 PBUBBLE_MEDIA_INFO item_data = NULL;
982 EINA_LIST_FOREACH(bubble_data->media_list,l,item_data) {
984 if (item_data->isChecked) {
985 char dst[MSG_FILEPATH_LEN_MAX+1] = {0,};
986 snprintf(dst, MSG_FILEPATH_LEN_MAX, "%s/%s", MSG_BUBBLE_DOWNLOAD_DIR, item_data->filename);
988 if (ecore_file_exists(dst) == EINA_FALSE) {
989 ret = ecore_file_cp(item_data->filepath, dst);
991 // make new file path
992 char *file_ext = NULL;
993 char file_name_no_ext[MSG_FILENAME_LEN_MAX+1] = {0,};
994 char new_file_path[MSG_FILENAME_LEN_MAX+1] = {0,};
996 file_ext = strrchr(item_data->filename, '.') + 1;
997 strncpy(file_name_no_ext, item_data->filename, strlen(item_data->filename) - strlen(file_ext) - 1);
1000 while(count < 100) {
1001 snprintf(new_file_path, MSG_FILENAME_LEN_MAX, "%s/%s_%02d.%s", MSG_BUBBLE_DOWNLOAD_DIR, file_name_no_ext, count, file_ext);
1002 if (ecore_file_exists(new_file_path) == EINA_TRUE) {
1005 ret = ecore_file_cp(item_data->filepath, new_file_path);
1014 if (ret == EINA_TRUE) {
1015 msg_ui_bubble_status_message_post(bubble_data, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_SAVED_IN_MY_FILES"));
1017 msg_ui_bubble_show_notify(bubble_data, dgettext("sys_string", "IDS_COM_POP_SAVING_FAILED"));
1020 if (bubble_data->media_list) {
1021 EINA_LIST_FREE(bubble_data->media_list, item_data) {
1026 bubble_data->media_list = eina_list_free(bubble_data->media_list);
1029 bubble_data->popup_genlist = NULL;
1030 bubble_data->media_chk_cnt = 0;
1031 bubble_data->save_button = NULL;
1037 static void __popup_save_attachment_close_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1041 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1042 void *item_data = NULL;
1044 if (bubble_data->popup) {
1045 evas_object_del(bubble_data->popup);
1046 bubble_data->popup = NULL;
1049 if (bubble_data->media_list) {
1050 EINA_LIST_FREE(bubble_data->media_list, item_data) {
1055 bubble_data->media_list = eina_list_free(bubble_data->media_list);
1058 bubble_data->popup_genlist = NULL;
1059 bubble_data->media_chk_cnt = 0;
1060 bubble_data->save_button = NULL;
1066 static void __msg_save_attachment_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1070 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1072 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1073 PMSG_APP_CONV_DATA_S conv_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
1074 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
1076 if (bubble_data->popup) {
1077 evas_object_del(bubble_data->popup);
1078 bubble_data->popup = NULL;
1082 D_EMSG("conv_data is NULL");
1086 int total_count = __msg_bubble_get_media_list(bubble_data, conv_data);
1088 if (total_count > 0) {
1089 /** create popup **/
1090 Evas_Object *popup = NULL;
1091 Evas_Object *genlist = NULL;
1092 Evas_Object *btn_save = NULL;
1093 Evas_Object *btn_close = NULL;
1094 PBUBBLE_MEDIA_INFO media_info = NULL;
1097 popup = elm_popup_add(cd->main_window);
1099 elm_object_style_set(popup, "min_menustyle");
1100 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1102 elm_object_part_text_set(popup, "title,text", dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_SAVE_ATTACHMENT"));
1104 /** create genlist **/
1105 genlist = elm_genlist_add(popup);
1106 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1107 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
1108 evas_object_data_set(genlist, "bubble_data", bubble_data);
1109 bubble_data->popup_genlist = genlist;
1111 bubble_data->itc_popup_selall.item_style = "1text.1icon.2";
1112 bubble_data->itc_popup_selall.func.text_get = __msg_ui_bubble_save_attachments_gl_text_get;
1113 bubble_data->itc_popup_selall.func.content_get = __msg_ui_bubble_save_attachments_gl_content_get;
1114 bubble_data->itc_popup_selall.func.state_get = NULL;
1115 bubble_data->itc_popup_selall.func.del = NULL;
1117 // Genlist style set
1118 bubble_data->itc_popup.item_style = "1text.2icon.2";
1119 bubble_data->itc_popup.func.text_get = __msg_ui_bubble_save_attachments_gl_text_get;
1120 bubble_data->itc_popup.func.content_get = __msg_ui_bubble_save_attachments_gl_content_get;
1121 bubble_data->itc_popup.func.state_get = NULL;
1122 bubble_data->itc_popup.func.del = NULL;
1124 // Add first Item, (select all)
1125 if (total_count > 1) {
1126 PBUBBLE_MEDIA_INFO select_all_info = NULL;
1127 const char *str_sel_all = dgettext("sys_string", "IDS_COM_BODY_SELECT_ALL");
1128 select_all_info = (PBUBBLE_MEDIA_INFO)calloc(1, sizeof(BUBBLE_MEDIA_INFO));
1129 strncpy(select_all_info->filename, str_sel_all, strlen(str_sel_all));
1130 elm_genlist_item_append(genlist, &bubble_data->itc_popup_selall, select_all_info, NULL, ELM_GENLIST_ITEM_NONE, __msg_ui_bubble_save_attachments_gl_sel, bubble_data);
1133 for (i=0; i<total_count; i++) {
1134 media_info = eina_list_nth(bubble_data->media_list, i);
1136 elm_genlist_item_append(genlist, &bubble_data->itc_popup, media_info, NULL, ELM_GENLIST_ITEM_NONE, __msg_ui_bubble_save_attachments_gl_sel, bubble_data);
1139 Evas_Object *box = elm_box_add(popup);
1140 if (total_count == 1)
1141 evas_object_size_hint_min_set(box, 0, MSG_BUBBLE_POPUP_LIST_1LINE_HEIGHT * elm_config_scale_get() * total_count);
1142 else if (total_count < MSG_BUBBLE_POPUP_LIST_MAX_MENU)
1143 evas_object_size_hint_min_set(box, 0, MSG_BUBBLE_POPUP_LIST_1LINE_HEIGHT * elm_config_scale_get() * (total_count+1)); // +1 for select all menu
1145 evas_object_size_hint_min_set(box, 0, MSG_BUBBLE_POPUP_LIST_1LINE_HEIGHT * elm_config_scale_get() * MSG_BUBBLE_POPUP_LIST_MAX_MENU);
1147 elm_box_pack_start(box, genlist);
1148 elm_object_content_set(popup, box);
1150 /*** creating Buttons ***/
1152 btn_save = elm_button_add(popup);
1153 elm_object_style_set(btn_save, "popup_button/default");
1154 elm_object_text_set(btn_save, dgettext("sys_string", "IDS_COM_SK_SAVE"));
1155 elm_object_part_content_set(popup, "button1", btn_save);
1156 evas_object_smart_callback_add(btn_save, "clicked", __popup_save_attachment_save_clicked_cb, bubble_data);
1157 elm_object_disabled_set(btn_save, EINA_TRUE);
1158 bubble_data->save_button = btn_save;
1161 btn_close = elm_button_add(popup);
1162 elm_object_style_set(btn_close, "popup_button/default");
1163 elm_object_text_set(btn_close, dgettext("sys_string", "IDS_COM_SK_CANCEL"));
1164 elm_object_part_content_set(popup, "button2", btn_close);
1165 evas_object_smart_callback_add(btn_close, "clicked", __popup_save_attachment_close_clicked_cb, bubble_data);
1167 evas_object_show(genlist);
1168 evas_object_show(popup);
1169 bubble_data->popup = popup;
1171 /** No attachment */
1172 D_MSG("No attachments");
1173 msg_ui_bubble_show_notify(bubble_data, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_NO_ATTACHMENTS"));
1179 static void __msg_forward_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1182 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1184 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1185 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
1186 PMSG_APP_CONV_DATA_S conv_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
1188 if (bubble_data->popup) {
1189 evas_object_del(bubble_data->popup);
1190 bubble_data->popup = NULL;
1194 D_EMSG("conv_data is NULL");
1198 char buf[DEF_BUF_LEN_S] = { 0, };
1199 service_h svc_handle;
1200 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
1201 D_EMSG("service_create() is failed !!");
1203 snprintf(buf, sizeof(buf), "%d", conv_data->msgId);
1204 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_MSG_ID, buf);
1205 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_MODE, MSG_BUNDLE_VALUE_FORWARD);
1206 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_FROM, MSG_BUNDLE_VALUE_INTERNAL);
1207 msg_ui_composer_launch_composer_create(cd, svc_handle);
1208 service_destroy(svc_handle);
1213 static void __msg_bubble_copy_to_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1216 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1218 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1219 PMSG_APP_CONV_DATA_S conv_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
1221 if (bubble_data->popup) {
1222 evas_object_del(bubble_data->popup);
1223 bubble_data->popup = NULL;
1227 D_EMSG("conv_data is NULL");
1228 msg_ui_bubble_show_notify(bubble_data, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_UNABLE_TO_COPY"));
1232 msg_error_t err = MSG_SUCCESS;
1234 msg_struct_t msg = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
1235 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
1237 if (msg_get_message(bubble_data->msgHandle, conv_data->msgId, msg, sendOpt) != MSG_SUCCESS)
1240 if (conv_data->msgType == MSG_TYPE_SMS) {
1241 if (conv_data->storageId == MSG_STORAGE_PHONE) {
1242 if ((msg_id = msg_add_message(bubble_data->msgHandle, msg, sendOpt)) < 0)
1244 bubble_data->copy_id = msg_id;
1245 err = msg_move_msg_to_storage(bubble_data->msgHandle, msg_id, MSG_STORAGE_SIM);
1246 } else if (conv_data->storageId == MSG_STORAGE_SIM) {
1247 msg_set_int_value(msg, MSG_MESSAGE_STORAGE_ID_INT, MSG_STORAGE_PHONE);
1248 if ((msg_id = msg_add_message(bubble_data->msgHandle, msg, sendOpt)) < 0)
1251 D_EMSG("invalid storage id [%d]", conv_data->storageId);
1254 /** remove if it failed to move */
1255 if (err != MSG_SUCCESS)
1256 msg_delete_message(bubble_data->msgHandle, msg_id);
1259 if (err == MSG_SUCCESS) {
1260 msg_ui_bubble_status_message_post(bubble_data, dgettext("sys_string", "IDS_COM_POP_COPIED_P"));
1261 if (conv_data->storageId != MSG_STORAGE_PHONE)
1262 msg_ui_bubble_list_load(bubble_data);
1268 msg_release_struct(&msg);
1271 msg_release_struct(&sendOpt);
1279 msg_release_struct(&msg);
1282 msg_release_struct(&sendOpt);
1284 msg_ui_bubble_show_notify(bubble_data, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_UNABLE_TO_COPY"));
1288 static void __msg_bubble_view_detail_msg_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1292 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1294 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1295 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
1296 PMSG_APP_CONV_DATA_S conv_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
1298 if (bubble_data->popup) {
1299 evas_object_del(bubble_data->popup);
1300 bubble_data->popup = NULL;
1304 Evas_Object *popup = elm_popup_add(cd->main_window);
1305 elm_object_style_set(popup, "min_menustyle");
1308 D_EMSG("create popup error !!! ");
1313 elm_object_part_text_set(popup, "title,text", dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_VIEW_MESSAGE_DETAILS_ABB"));
1316 Evas_Object *box = elm_box_add(popup);
1317 evas_object_size_hint_min_set(box, -1, 450);
1318 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1319 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1322 Evas_Object *entry = elm_entry_add(popup);
1323 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1324 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1326 elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
1327 elm_entry_editable_set(entry, EINA_FALSE);
1328 elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_NO_IMAGE);
1329 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1330 elm_entry_magnifier_disabled_set(entry, EINA_TRUE);
1331 elm_entry_scrollable_set(entry, EINA_TRUE);
1333 char *str = msg_common_make_message_detail_text(bubble_data->msgHandle, conv_data->msgId);
1336 elm_entry_entry_set(entry, str);
1340 evas_object_show(entry);
1341 evas_object_show(box);
1343 elm_box_pack_start(box, entry);
1344 elm_object_content_set(popup, box);
1346 // popup close button
1347 Evas_Object * btn1 = elm_button_add(popup);
1348 elm_object_style_set(btn1, "popup_button/default");
1349 elm_object_text_set(btn1, dgettext("sys_string", "IDS_COM_BODY_CLOSE"));
1350 elm_object_part_content_set(popup, "button1", btn1);
1352 evas_object_smart_callback_add(btn1, "clicked", __popup_close_clicked_cb, bubble_data);
1354 evas_object_show(popup);
1355 bubble_data->popup = popup;
1358 static void __longpressed_cb(void *data, Evas_Object *obj, void *event_info)
1361 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1363 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1364 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
1365 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !cd);
1367 Evas_Object *popup = NULL;
1368 Evas_Object *list = NULL;
1369 char title[DEF_THREAD_ADDR_LEN+1] = {0,};
1371 PMSG_APP_CONV_DATA_S conv_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
1372 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !conv_data);
1374 if(bubble_data->viewmode != BUBBLE_NORMAL_VIEW)
1378 popup = elm_popup_add(cd->main_window);
1380 D_EMSG("elm_popup_add returns NULL");
1384 elm_object_style_set(popup, "min_menustyle");
1385 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1387 /** set popup title */
1388 /** Sender: contents ... ex> "01012341234: Hello......" */
1389 if (bubble_data->threadName[0] != '\0')
1390 snprintf(title, DEF_THREAD_ADDR_LEN, "%s: %s", bubble_data->threadName, conv_data->msgText);
1392 snprintf(title, DEF_THREAD_ADDR_LEN, "%s: %s", dgettext("sys_string", "IDS_COM_BODY_UNKNOWN"), conv_data->msgText);
1394 /** create menu list */
1395 list = elm_list_add(cd->main_window);
1396 elm_list_mode_set(list, ELM_LIST_EXPAND);
1397 evas_object_size_hint_max_set(list, -1, MSG_BUBBLE_POPUP_LIST_1LINE_HEIGHT * MSG_BUBBLE_POPUP_LIST_MAX_MENU * elm_config_scale_get());
1402 evas_object_data_set(list, "conv_data", conv_data);
1404 elm_list_item_append(list, dgettext("sys_string", "IDS_COM_SK_DELETE"), NULL, NULL, __msg_delete_clicked_cb, bubble_data);
1405 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_COPY_MESSAGE_TEXT_ABB"), NULL, NULL, __msg_copy_clicked_cb, bubble_data);
1406 if (conv_data->bProtected == true)
1407 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_PROTECTION_OFF"), NULL, NULL, __msg_protect_clicked_cb, bubble_data);
1409 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_PROTECTION_ON"), NULL, NULL, __msg_protect_clicked_cb, bubble_data);
1410 elm_list_item_append(list, dgettext("sys_string", "IDS_COM_BODY_FORWARD"), NULL, NULL, __msg_forward_clicked_cb, bubble_data);
1412 if (conv_data->msgType == MSG_TYPE_SMS) {
1413 if (conv_data->storageId == MSG_STORAGE_PHONE)
1414 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_COPY_TO_SIM"), NULL, NULL, __msg_bubble_copy_to_clicked_cb, bubble_data);
1415 else if (conv_data->storageId == MSG_STORAGE_SIM)
1416 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_COPY_TO_PHONE"), NULL, NULL, __msg_bubble_copy_to_clicked_cb, bubble_data);
1417 } else if (conv_data->msgType == MSG_TYPE_MMS) {
1418 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_SAVE_ATTACHMENT"), NULL, NULL, __msg_save_attachment_clicked_cb, bubble_data);
1421 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_VIEW_MESSAGE_DETAILS_ABB"), NULL, NULL, __msg_bubble_view_detail_msg_clicked_cb, bubble_data);
1424 elm_object_part_text_set(popup,"title,text",title);
1425 elm_object_content_set(popup, list);
1427 Evas_Object * btn1 = elm_button_add(popup);
1428 elm_object_style_set(btn1, "popup_button/default");
1429 elm_object_text_set(btn1, dgettext("sys_string", "IDS_COM_BODY_CLOSE"));
1430 elm_object_part_content_set(popup, "button1", btn1);
1431 bubble_data->popup = popup;
1433 evas_object_show(popup);
1435 evas_object_smart_callback_add(btn1, "clicked", __popup_close_clicked_cb, bubble_data);
1441 static void __set_msg_data_by_conv_data(PMSG_BUBBLE_DATA bubble_data, PMSG_APP_CONV_DATA_S conv_data, msg_struct_t msgInfo)
1443 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !conv_data || !msgInfo || !bubble_data);
1445 char *msg_date = NULL;
1447 msg_get_int_value(msgInfo, MSG_CONV_MSG_ID_INT, (int *)(&conv_data->msgId));
1448 msg_get_int_value(msgInfo, MSG_CONV_MSG_TYPE_INT, &conv_data->msgType);
1449 msg_get_int_value(msgInfo, MSG_CONV_MSG_STORAGE_ID_INT, (int *)(&conv_data->storageId));
1451 if (conv_data->msgTime == NULL)
1452 conv_data->msgTime = (time_t *) calloc(1, sizeof(time_t));
1454 if (conv_data->msgTime) {
1455 bzero(conv_data->msgTime,sizeof(time_t));
1456 msg_get_int_value(msgInfo, MSG_CONV_MSG_DISPLAY_TIME_INT, (int *)conv_data->msgTime);
1457 msg_date = msg_common_get_display_date(bubble_data->locale, bubble_data->date_ptn_default, bubble_data->date_ptn_year, conv_data->msgTime);
1458 snprintf(conv_data->displayDate, sizeof(conv_data->displayDate), "%s", msg_date);
1463 msg_get_int_value(msgInfo, MSG_CONV_MSG_NETWORK_STATUS_INT, (int *)(&conv_data->networkStatus));
1464 msg_get_bool_value(msgInfo, MSG_CONV_MSG_READ_BOOL, &conv_data->bRead);
1465 msg_get_bool_value(msgInfo, MSG_CONV_MSG_PROTECTED_BOOL, &conv_data->bProtected);
1466 msg_get_int_value(msgInfo, MSG_CONV_MSG_DIRECTION_INT, &conv_data->direction);
1468 bzero(conv_data->thumbNailPath, sizeof(conv_data->thumbNailPath));
1469 msg_get_str_value(msgInfo, MSG_CONV_MSG_IMAGE_THUMB_PATH_STR, conv_data->thumbNailPath, DEF_IMG_PATH_LEN);
1471 if (conv_data->thumbNailPath[0] == '\0') {
1472 msg_get_str_value(msgInfo, MSG_CONV_MSG_VIDEO_THUMB_PATH_STR, conv_data->thumbNailPath, DEF_IMG_PATH_LEN);
1474 if (conv_data->thumbNailPath[0] == '\0')
1475 conv_data->thumbType = BUBBLE_THUMBNAIL_VIDEO;
1477 conv_data->thumbType = BUBBLE_THUMBNAIL_NONE;
1480 conv_data->thumbType = BUBBLE_THUMBNAIL_IMAGE;
1483 bzero(conv_data->audio_filename, sizeof(conv_data->audio_filename));
1484 msg_get_str_value(msgInfo, MSG_CONV_MSG_AUDIO_NAME_STR, conv_data->audio_filename, DEF_IMG_PATH_LEN);
1486 bzero(conv_data->subject, sizeof(conv_data->subject));
1487 msg_get_str_value(msgInfo, MSG_CONV_MSG_SUBJECT_STR, conv_data->subject, DEF_BUF_LEN_S);
1489 if (conv_data->msgType == MSG_TYPE_MMS) {
1490 msg_get_str_value(msgInfo, MSG_CONV_MSG_TEXT_STR, conv_data->msgText, DEF_MAX_MSG_TEXT_LEN); /** get body text */
1491 msg_get_int_value(msgInfo, MSG_CONV_MSG_ATTACH_COUNT_INT, &conv_data->attachment_cnt); /** get attachment count */
1492 if (conv_data->attachment_cnt == 1)
1493 msg_get_str_value(msgInfo, MSG_CONV_MSG_ATTACH_NAME_STR, conv_data->attachment_filename, DEF_IMG_PATH_LEN);
1494 } else if (conv_data->msgType == MSG_TYPE_MMS_NOTI) {
1495 bzero(conv_data->msgText, sizeof(conv_data->msgText));
1497 msg_get_str_value(msgInfo, MSG_CONV_MSG_TEXT_STR, conv_data->msgText, DEF_MAX_MSG_TEXT_LEN);
1501 static int __calc_scroller_geometry(PMSG_BUBBLE_DATA bubble_data)
1505 elm_scroller_child_size_get(bubble_data->scrl, &sw, &sh);
1510 void __msg_resend_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1514 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1515 PMSG_APP_CONV_DATA_S item_data = NULL;
1517 if (bubble_data->popup) {
1518 evas_object_del(bubble_data->popup);
1519 bubble_data->popup = NULL;
1522 item_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
1524 msg_ui_bubble_resend_msg(bubble_data, item_data->msgId);
1529 void __msg_install_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1533 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1534 PMSG_APP_CONV_DATA_S item_data = NULL;
1536 item_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
1538 __msg_install_clicked_cb(bubble_data, item_data->msgId);
1543 void __msg_retrieve_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1547 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1548 PMSG_APP_CONV_DATA_S item_data = NULL;
1550 item_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
1552 __msg_retrieve_clicked_cb(bubble_data, item_data->msgId);
1557 void __msg_more_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1561 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
1563 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1564 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, bubble_data->viewmode != BUBBLE_NORMAL_VIEW);
1567 PMSG_APP_CONV_DATA_S item_data = NULL;
1568 item_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
1570 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !item_data);
1574 vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &BatteryStatus);
1575 D_MSG("Battery status = [%d]", BatteryStatus);
1577 if (BatteryStatus == VCONFKEY_SYSMAN_BAT_POWER_OFF) {
1578 int charger_status = -1;
1579 vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW, &charger_status);
1581 if (!charger_status) {
1582 msg_ui_bubble_show_notify(bubble_data, dgettext("sys_string", "IDS_COM_BODY_LOW_BATTERY"));
1587 service_h svc_handle;
1588 char msgId[DEF_BUF_LEN_S] = {0,};
1590 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
1591 D_EMSG("service_create() is failed !!");
1593 snprintf(msgId, DEF_BUF_LEN_S, "%d", item_data->msgId);
1594 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_MSG_ID, msgId);
1595 msg_ui_composer_launch_viewer_create(bubble_data->callback_data, svc_handle);
1596 service_destroy(svc_handle);
1600 static void __msg_send_failed_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1603 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
1605 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1606 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, bubble_data->viewmode != BUBBLE_NORMAL_VIEW);
1608 PMSG_APP_CONV_DATA_S conv_data = (PMSG_APP_CONV_DATA_S)evas_object_data_get(obj, "conv_data");
1609 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
1611 if (bubble_data->popup) {
1612 evas_object_del(bubble_data->popup);
1613 bubble_data->popup = NULL;
1616 Evas_Object *popup = elm_popup_add(cd->main_window);
1617 elm_object_style_set(popup, "min_menustyle");
1618 elm_object_part_text_set(popup, "title,text", dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_SENDING_FAILED_MESSAGE"));
1620 Evas_Object *btn_close = elm_button_add(popup);
1621 elm_object_style_set(btn_close, "popup_button/default");
1622 elm_object_text_set(btn_close, dgettext("sys_string", "IDS_COM_BODY_CLOSE"));
1623 elm_object_part_content_set(popup, "button1", btn_close);
1624 evas_object_smart_callback_add(btn_close, "clicked", msg_ui_popup_close_clicked_cb, bubble_data);
1626 Evas_Object *list = elm_list_add(popup);
1627 elm_list_mode_set(list, ELM_LIST_EXPAND);
1628 evas_object_data_set(list, "conv_data", conv_data);
1630 elm_list_item_append(list, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_SK_RESEND"), NULL, NULL, __msg_resend_btn_clicked_cb, (void *)bubble_data);
1631 elm_list_item_append(list, dgettext("sys_string", "IDS_COM_SK_DELETE"), NULL, NULL, __msg_delete_clicked_cb, (void *)bubble_data);
1634 elm_object_content_set(popup, list);
1635 evas_object_show(popup);
1637 bubble_data->popup = popup;
1640 void msg_ui_bubble_fill_bubble_contents(PMSG_BUBBLE_DATA bubble_data, PMSG_APP_CONV_DATA_S item_data)
1643 MSG_UI_RET_IF(MSG_UI_LEVEL_ASSERT, !bubble_data || !item_data);
1644 char time_status_str[DEF_BUF_LEN + DEF_BUF_LEN_S + 1] = {0, };
1645 char *time_str = NULL;
1647 __msg_bubble_add_content(bubble_data, item_data);
1649 if (item_data->msgType == MSG_TYPE_MMS) {
1650 Evas_Object *prev_obj = NULL;
1651 Evas_Object *media_layout = elm_layout_add(item_data->entry);
1653 elm_layout_file_set(media_layout, MSGC_UI_DEFAULT_EDJ, MSGC_EDJ_GRP_BUBBLE_MEDIA_LAYOUT);
1655 prev_obj = elm_object_part_content_get(item_data->entry, "elm.swallow.end");
1657 elm_object_part_content_unset(item_data->entry, "elm.swallow.end");
1658 evas_object_del(prev_obj);
1661 if (item_data->networkStatus == MSG_NETWORK_SEND_SUCCESS || item_data->networkStatus == MSG_NETWORK_SEND_FAIL || item_data->networkStatus == MSG_NETWORK_RETRIEVE_SUCCESS) {
1662 /** add more button */
1663 Evas_Object *more_btn = elm_button_add(media_layout);
1664 elm_object_style_set(more_btn, "reveal");
1665 evas_object_data_set(more_btn, "conv_data", item_data);
1666 evas_object_smart_callback_add(more_btn, "clicked", __msg_more_btn_clicked_cb, bubble_data);
1668 elm_object_part_content_set(media_layout, "bubble.swallow.more", more_btn);
1669 evas_object_smart_calculate(media_layout);
1671 elm_object_part_text_set(media_layout, "msgtype_text", dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_MMS"));
1672 evas_object_show(more_btn);
1675 evas_object_show(media_layout);
1676 elm_object_part_content_set(item_data->entry, "elm.swallow.end", media_layout);
1677 elm_entry_calc_force(item_data->entry);
1678 } else if (item_data->msgType == MSG_TYPE_MMS_NOTI && item_data->networkStatus != MSG_NETWORK_RETRIEVE_SUCCESS && item_data->networkStatus != MSG_NETWORK_RETRIEVING) {
1679 Evas_Object *prev_obj = NULL;
1680 Evas_Object *retrieve_btn = NULL;
1681 prev_obj = elm_object_part_content_get(item_data->entry, "elm.swallow.end");
1683 elm_object_part_content_unset(item_data->entry, "elm.swallow.end");
1684 evas_object_del(prev_obj);
1687 retrieve_btn = elm_button_add(item_data->entry);
1688 elm_object_text_set(retrieve_btn, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_RETRIEVE"));
1689 evas_object_data_set(retrieve_btn, "conv_data", item_data);
1691 evas_object_smart_callback_add(retrieve_btn, "clicked", __msg_retrieve_btn_clicked_cb, bubble_data);
1693 elm_object_part_content_set(item_data->entry, "elm.swallow.end", retrieve_btn);
1694 } else if (item_data->msgType == MSG_TYPE_SMS_SYNCML) {
1695 Evas_Object *prev_obj = NULL;
1696 Evas_Object *install_btn = NULL;
1697 prev_obj = elm_object_part_content_get(item_data->entry, "elm.swallow.end");
1699 elm_object_part_content_unset(item_data->entry, "elm.swallow.end");
1700 evas_object_del(prev_obj);
1703 install_btn = elm_button_add(item_data->entry);
1704 elm_object_text_set(install_btn, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_INSTALL"));
1705 evas_object_data_set(install_btn, "conv_data", item_data);
1707 evas_object_smart_callback_add(install_btn, "clicked", __msg_install_btn_clicked_cb, bubble_data);
1709 elm_object_part_content_set(item_data->entry, "elm.swallow.end", install_btn);
1712 /** Network status (Sending, Retrieving); */
1713 switch (item_data->networkStatus) {
1714 case MSG_NETWORK_SEND_FAIL:
1715 if (item_data->direction == MSG_DIRECTION_TYPE_MO) {
1716 if (item_data->progressbar) {
1717 evas_object_del(item_data->progressbar);
1718 item_data->progressbar = NULL;
1721 item_data->failed_button = elm_button_add(item_data->entry);
1722 elm_object_style_set(item_data->failed_button, "warning");
1723 evas_object_show(item_data->failed_button);
1724 elm_object_part_content_set(item_data->entry, "elm.swallow.icon1", item_data->failed_button);
1726 evas_object_data_set(item_data->failed_button, "conv_data", item_data);
1727 evas_object_smart_callback_add(item_data->failed_button, "clicked", __msg_send_failed_btn_clicked_cb, bubble_data);
1729 elm_object_signal_emit(item_data->entry, "elm,state,text,status,disabled", "elm");
1730 elm_object_signal_emit(item_data->entry, "elm,state,content,status,enabled", "elm");
1732 strncpy(time_status_str, dgettext("sys_string", "IDS_COM_POP_FAILED"), sizeof(time_status_str)-1);
1735 case MSG_NETWORK_RETRIEVE_FAIL:
1736 /** elm.text.status */
1737 strncpy(time_status_str, dgettext("sys_string", "IDS_COM_POP_FAILED"), sizeof(time_status_str)-1);
1739 case MSG_NETWORK_SENDING:
1740 case MSG_NETWORK_RETRIEVING:
1741 /** Add progress icon */
1742 if (item_data->progressbar) {
1743 evas_object_del(item_data->progressbar);
1744 item_data->progressbar = NULL;
1747 item_data->progressbar = elm_progressbar_add(item_data->entry);
1748 elm_object_style_set(item_data->progressbar, "list_process_small");
1749 evas_object_show(item_data->progressbar);
1750 elm_progressbar_pulse(item_data->progressbar, EINA_TRUE);
1751 elm_object_part_content_set(item_data->entry, "elm.swallow.icon1", item_data->progressbar);
1753 elm_object_signal_emit(item_data->entry, "elm,state,text,status,disabled", "elm");
1754 elm_object_signal_emit(item_data->entry, "elm,state,content,status,enabled", "elm");
1758 time_str = __msg_ui_get_display_time(item_data->msgTime, bubble_data);
1760 strncpy(time_status_str, time_str, sizeof(time_status_str)-1);
1763 /** This "else" case is for avoiding NULL of the time_status_str */
1764 /** if time_status_str is NULL, it could be shown progress icon although it's not sending or retrieving */
1765 strncpy(time_status_str, item_data->displayDate, sizeof(time_status_str)-1);
1770 if (time_status_str[0] != '\0') {
1771 if (item_data->progressbar) {
1772 evas_object_del(item_data->progressbar);
1773 item_data->progressbar = NULL;
1776 elm_object_part_text_set(item_data->entry, "elm.text.time", time_status_str);
1777 elm_object_signal_emit(item_data->entry, "elm,state,text,status,enabled", "elm");
1778 elm_object_signal_emit(item_data->entry, "elm,state,content,status,disabled", "elm");
1783 Eina_Bool msg_ui_bubble_item_load_cb(void *data)
1787 MSG_UI_RETV_IF(MSG_UI_LEVEL_DEBUG, !data, EINA_FALSE);
1789 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA) data;
1790 PMSG_APP_CONV_DATA_S item_data = NULL;
1793 bool cb_cancel = false;
1795 evas_object_smart_callback_del(bubble_data->scrl, "edge,top", msg_ui_bubble_scroll_edge_top_cb);
1797 if (bubble_data->added_count%(MSG_BUBBLE_BLOCK_COUNT+1) == MSG_BUBBLE_BLOCK_COUNT || bubble_data->bubble_index < 0) {
1800 if (bubble_data->bubble_list) {
1801 item_data = (PMSG_APP_CONV_DATA_S) eina_list_nth(bubble_data->bubble_list, bubble_data->bubble_index);
1802 if (item_data == NULL)
1810 if (cb_cancel == false) {
1811 elm_scroller_gravity_get(bubble_data->scrl, NULL, &scr_g);
1813 elm_scroller_gravity_set(bubble_data->scrl, 0.0, 1.0);
1815 __add_bubble_item(bubble_data, item_data, MSG_BOX_PACK_START, NULL);
1817 /* add date seperator */
1818 PMSG_APP_CONV_DATA_S prev_data = NULL;
1819 Evas_Object * layout = NULL;
1820 prev_data = (PMSG_APP_CONV_DATA_S) eina_list_nth(bubble_data->bubble_list, bubble_data->bubble_index - 1);
1822 if((!prev_data || g_strcmp0(prev_data->displayDate, item_data->displayDate) != 0)) {
1823 layout = elm_layout_add(bubble_data->box);
1824 elm_layout_file_set(layout, MSGC_UI_DEFAULT_EDJ, "composer/content/bubble/date_line");
1825 elm_object_part_text_set(layout, "elm.text.date", item_data->displayDate);
1826 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1827 evas_object_size_hint_align_set(layout,EVAS_HINT_FILL,EVAS_HINT_FILL);
1828 evas_object_show(layout);
1830 elm_box_pack_start(bubble_data->box, layout);
1833 bubble_data->realized_list = eina_list_append(bubble_data->realized_list, item_data);
1835 bubble_data->bubble_index--;
1836 bubble_data->added_count++;
1838 elm_scroller_gravity_set(bubble_data->scrl, 0.0, 0.0);
1839 evas_object_show(bubble_data->scrl);
1840 if (g_isFirstLoading) {
1841 Evas_Coord height = __calc_scroller_geometry(bubble_data);
1842 if (height <= MSG_BUBBLE_CONTENT_H)
1843 elm_scroller_region_show(bubble_data->scrl, 0, 0, 0, 0);
1845 elm_scroller_region_show(bubble_data->scrl, 0, height, 0, 0);
1847 g_isFirstLoading = false;
1850 bubble_data->load_animator = NULL;
1851 bubble_data->added_count = 0;
1853 return ECORE_CALLBACK_CANCEL;
1858 return ECORE_CALLBACK_RENEW;
1862 void msg_ui_bubble_list_load(PMSG_BUBBLE_DATA bubble_data)
1864 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1865 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !bubble_data);
1867 msg_error_t err = MSG_SUCCESS;
1868 MSG_COMPOSER_VIEW_DATA_S *cd = (MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data;
1869 msg_struct_list_s conv_list;
1870 PMSG_APP_CONV_DATA_S item_data = NULL;
1873 err = msg_get_conversation_view_list(bubble_data->msgHandle, bubble_data->threadId, &conv_list);
1874 if (err != MSG_SUCCESS)
1877 msg_ui_bubble_start_bubble_list(bubble_data);
1878 g_isFirstLoading = true;
1880 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Bubble count = %d", conv_list.nCount);
1882 bubble_data->bubble_count = conv_list.nCount;
1884 if (bubble_data->bubble_count <= 0) {
1885 msg_release_list_struct(&conv_list);
1889 int folder_id = MSG_MAX_FOLDER_ID;
1892 for (i = 0; i < conv_list.nCount; i++) {
1893 msg_get_int_value(conv_list.msg_struct_info[i], MSG_CONV_MSG_FOLDER_ID_INT, &folder_id);
1895 if (folder_id == MSG_DRAFT_ID) {
1896 msg_get_int_value(conv_list.msg_struct_info[i], MSG_CONV_MSG_ID_INT, &msg_id);
1897 D_MSG("msg_id = %d is a draft message", msg_id);
1899 bubble_data->bubble_count--;
1900 bubble_data->isDraft = true;
1905 item_data = (PMSG_APP_CONV_DATA_S) calloc(1, sizeof(MSG_APP_CONV_DATA_S));
1906 __set_msg_data_by_conv_data(bubble_data, item_data, conv_list.msg_struct_info[i]);
1908 bubble_data->bubble_list = eina_list_append(bubble_data->bubble_list, (const void *)item_data);
1911 /* load last draft message */
1912 if (bubble_data->isDraft) {
1913 D_MSG("last draft msgid is %d", msg_id);
1915 cd->loading_draft = true;
1917 msg_ui_composer_message_init();
1918 msg_ui_composer_message_load_message(cd->msg_handle, msg_id);
1919 if (msg_ui_composer_message_set_loaded_data(cd, false) != COMPOSER_RETURN_CREATION_WARINING_MODE_FAIL)
1920 msg_ui_composer_message_destroy();
1922 cd->loading_draft = false;
1926 bubble_data->msg_type = item_data->msgType;
1927 if (bubble_data->msg_type == MSG_TYPE_SMS_WAPPUSH || bubble_data->msg_type == MSG_TYPE_SMS_CB || bubble_data->msg_type == MSG_TYPE_SMS_SYNCML)
1928 msg_ui_composer_editable_set(cd, EINA_FALSE);
1930 msg_ui_composer_editable_set(cd, EINA_TRUE);
1933 msg_release_list_struct(&conv_list);
1935 bubble_data->bubble_index = bubble_data->bubble_count - 1; // bubble_index : Message index to append on box.
1936 bubble_data->load_animator = ecore_animator_add(msg_ui_bubble_item_load_cb, (const void *)bubble_data);
1938 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1942 void msg_ui_bubble_list_data_update(PMSG_BUBBLE_DATA bubble_data)
1946 PMSG_APP_CONV_DATA_S item_data = NULL;
1948 Eina_List *l = NULL;
1949 EINA_LIST_FOREACH (bubble_data->bubble_list, l, item_data) {
1951 msg_ui_bubble_fill_bubble_contents(bubble_data, item_data);
1958 void msg_ui_bubble_item_data_update(PMSG_BUBBLE_DATA bubble_data, msg_struct_t msg)
1962 PMSG_APP_CONV_DATA_S item_data = NULL;
1966 msg_get_int_value(msg, MSG_CONV_MSG_ID_INT, &msg_id);
1967 msg_get_int_value(msg, MSG_CONV_MSG_DISPLAY_TIME_INT, (int *)(&msgTime));
1969 Eina_List *l = NULL;
1970 EINA_LIST_FOREACH (bubble_data->bubble_list, l, item_data) {
1972 if (item_data->msgId == msg_id) {
1973 if (bubble_data->ug_state != BUBBLE_UG_PAUSE)
1974 msg_update_read_status(bubble_data->msgHandle, msg_id, true);
1976 if ( *item_data->msgTime != msgTime ){
1977 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "item_data->msgTime = %d and msgTime = %d", *item_data->msgTime, msgTime);
1978 msg_ui_bubble_list_item_move(bubble_data, msg);
1980 __set_msg_data_by_conv_data(bubble_data, item_data, msg);
1981 msg_ui_bubble_fill_bubble_contents(bubble_data, item_data);
1991 Eina_Bool msg_ui_bubble_item_add_cb(void *data)
1994 MSG_UI_RETV_IF(MSG_UI_LEVEL_DEBUG, !data, EINA_FALSE);
1996 PMSG_BUBBLE_DATA bubble_data = (PMSG_BUBBLE_DATA)data;
1997 BUBBLE_PACK_INFO *pack_info = NULL;
1999 bool cb_cancel = false;
2001 if (bubble_data->added_list) {
2002 pack_info = (BUBBLE_PACK_INFO *) eina_list_nth(bubble_data->added_list, 0);
2003 if (pack_info == NULL) {
2006 if (bubble_data->ug_state != BUBBLE_UG_PAUSE && bubble_data->ug_state != BUBBLE_UG_DESTROY)
2007 msg_update_read_status(bubble_data->msgHandle, pack_info->add_item->msgId, true);
2014 if (cb_cancel == true) {
2015 elm_scroller_gravity_set(bubble_data->scrl, 0.0, 0.0);
2016 elm_scroller_region_show(bubble_data->scrl, 0, __calc_scroller_geometry(bubble_data), 0, 0);
2018 bubble_data->add_animator = NULL;
2020 return ECORE_CALLBACK_CANCEL;
2023 elm_scroller_gravity_set(bubble_data->scrl, 0.0, 1.0);
2026 __add_bubble_item(bubble_data, pack_info->add_item, pack_info->pack_type, pack_info->rel_obj);
2028 bubble_data->realized_list = eina_list_append(bubble_data->realized_list, pack_info->add_item);
2030 bubble_data->added_list = eina_list_remove(bubble_data->added_list, pack_info);
2032 bubble_data->bubble_count++;
2037 return ECORE_CALLBACK_RENEW;
2041 void msg_ui_bubble_list_update_read_status(PMSG_BUBBLE_DATA bubble_data)
2044 PMSG_APP_CONV_DATA_S item_data = NULL;
2046 Eina_List *l = NULL;
2047 EINA_LIST_FOREACH (bubble_data->bubble_list, l, item_data) {
2049 if (!item_data->bRead)
2050 msg_update_read_status(bubble_data->msgHandle, item_data->msgId, true);
2057 void msg_ui_bubble_list_append(PMSG_BUBBLE_DATA bubble_data, msg_struct_t msg)
2059 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !bubble_data);
2063 Eina_List *l = NULL;
2064 PMSG_APP_CONV_DATA_S item_data = NULL;
2066 msg_get_int_value(msg, MSG_CONV_MSG_ID_INT, &msg_id);
2067 msg_get_int_value(msg, MSG_CONV_MSG_FOLDER_ID_INT, &folder_id);
2069 if (folder_id == MSG_DRAFT_ID)
2072 EINA_LIST_FOREACH(bubble_data->bubble_list, l, item_data) {
2073 if (item_data && item_data->msgId == msg_id)
2077 PMSG_APP_CONV_DATA_S conv_data = NULL;
2078 conv_data = (PMSG_APP_CONV_DATA_S) calloc(1, sizeof(MSG_APP_CONV_DATA_S));
2079 __set_msg_data_by_conv_data(bubble_data, conv_data, msg);
2081 BUBBLE_PACK_INFO *pack_info = (BUBBLE_PACK_INFO *)calloc(1, sizeof(BUBBLE_PACK_INFO));
2082 pack_info->add_item = conv_data;
2083 pack_info->rel_obj = NULL;
2084 pack_info->pack_type = MSG_BOX_PACK_END;
2086 bubble_data->added_list = eina_list_append(bubble_data->added_list, (const void *)pack_info);
2087 bubble_data->bubble_list = eina_list_append(bubble_data->bubble_list, (const void *)conv_data);
2089 if (bubble_data->viewmode == BUBBLE_EDIT_VIEW)
2092 if (bubble_data->add_animator)
2095 bubble_data->add_animator = ecore_animator_add(msg_ui_bubble_item_add_cb, (const void *) bubble_data);
2100 void msg_ui_bubble_list_item_move(PMSG_BUBBLE_DATA bubble_data, msg_struct_t msg)
2104 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !bubble_data);
2107 PMSG_APP_CONV_DATA_S prev_data = NULL;
2108 PMSG_APP_CONV_DATA_S insert_data = NULL;
2109 BUBBLE_PACK_INFO *add_pack_info = NULL;
2111 msg_get_int_value(msg, MSG_CONV_MSG_ID_INT, &msg_id);
2114 EINA_LIST_FOREACH(bubble_data->added_list, l, add_pack_info) {
2115 if (add_pack_info) {
2116 if (add_pack_info->add_item->msgId == msg_id) {
2117 bubble_data->added_list = eina_list_remove(bubble_data->added_list, (const void *)add_pack_info);
2118 free(add_pack_info);
2124 EINA_LIST_FOREACH(bubble_data->bubble_list, l, prev_data) {
2126 if (prev_data->msgId == msg_id) {
2127 if (eina_list_data_find(bubble_data->realized_list, (const void *)prev_data)) {
2128 elm_box_unpack(bubble_data->box, prev_data->ly);
2129 evas_object_hide(prev_data->ly);
2130 evas_object_del(prev_data->ly);
2132 bubble_data->realized_list = eina_list_remove(bubble_data->realized_list, (const void *)prev_data);
2135 bubble_data->bubble_list = eina_list_remove(bubble_data->bubble_list, (const void *)prev_data);
2137 bubble_data->bubble_count--;
2140 if (prev_data->msgTime)
2141 free(prev_data->msgTime);
2150 insert_data = (PMSG_APP_CONV_DATA_S) calloc(1, sizeof(MSG_APP_CONV_DATA_S));
2151 __set_msg_data_by_conv_data(bubble_data, insert_data, msg);
2153 BUBBLE_PACK_INFO *pack_info = (BUBBLE_PACK_INFO *)calloc(1, sizeof(BUBBLE_PACK_INFO));
2154 pack_info->add_item = insert_data;
2155 pack_info->rel_obj = NULL;
2156 pack_info->pack_type = MSG_BOX_PACK_END;
2158 bubble_data->bubble_list = eina_list_append(bubble_data->bubble_list, (const void *)insert_data);
2159 bubble_data->added_list = eina_list_append(bubble_data->added_list, (const void *)pack_info);
2162 if (bubble_data->viewmode == BUBBLE_EDIT_VIEW || bubble_data->ug_state == BUBBLE_UG_PAUSE)
2165 if (bubble_data->add_animator)
2168 bubble_data->add_animator = ecore_animator_add(msg_ui_bubble_item_add_cb, (const void *) bubble_data);
2173 void msg_ui_bubble_delete_msg(PMSG_BUBBLE_DATA bubble_data, int msg_id)
2176 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !bubble_data);
2179 if (bubble_data->popup) {
2180 evas_object_del(bubble_data->popup);
2181 bubble_data->popup = NULL;
2184 bool isDraft = msg_ui_composer_common_is_send_possible((MSG_COMPOSER_VIEW_DATA_S *)bubble_data->callback_data);
2186 if (bubble_data->bubble_count == 1 && isDraft == false) {
2187 bubble_data->bubble_count = 0;
2188 err = msg_delete_thread_message_list(bubble_data->msgHandle, bubble_data->threadId, false);
2190 err = msg_delete_message(bubble_data->msgHandle, msg_id);
2191 msg_ui_bubble_list_load(bubble_data);
2194 if (err != MSG_SUCCESS) {
2195 msg_ui_bubble_show_notify(bubble_data, dgettext("sys_string", "IDS_COM_POP_UNABLE_TO_DELETE"));
2197 msg_ui_bubble_show_deleted_info(bubble_data);
2203 void msg_ui_bubble_refresh_msg_lock_status(PMSG_BUBBLE_DATA bubble_data, int msg_id)
2206 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !bubble_data);
2207 PMSG_APP_CONV_DATA_S conv_data = NULL;
2209 bool is_found = false;
2211 EINA_LIST_FOREACH(bubble_data->bubble_list, l, conv_data) {
2213 if (msg_id == conv_data->msgId) {
2214 conv_data->bProtected = !conv_data->bProtected;
2215 msg_ui_bubble_fill_bubble_contents(bubble_data, conv_data);
2216 is_found = !is_found;
2223 D_MSG("given msg_id(%d) is not found within current bubble data", msg_id);