merge with latest viewer code
authorSungbok Park <parksb@samsung.com>
Tue, 13 Nov 2012 17:15:49 +0000 (02:15 +0900)
committerSungbok Park <parksb@samsung.com>
Tue, 13 Nov 2012 17:15:49 +0000 (02:15 +0900)
Change-Id: Ide966bdb3c1f9e0d0a13909377ca6ee48f998e26

viewer/include/email-viewer-utils.h
viewer/include/email-viewer.h
viewer/src/email-viewer-logic.c
viewer/src/email-viewer-utils.c
viewer/src/email-viewer-webview.c
viewer/src/email-viewer.c

index 88aeeaa..4c390bd 100755 (executable)
@@ -64,6 +64,8 @@ void _move_email(EmailViewerUGD *ug_data, int dest_folder_id, gboolean is_delete
 void _delete_email(EmailViewerUGD *ug_data);
 void _notify_mailbox_size(EmailViewerUGD *ug_data, char *size);
 
+int viewer_get_filepath_from_path(char *default_path, char *origin_path, char *new_path, Eina_Bool get_new_path);
+Eina_Bool viewer_save_file(const gchar *path, const gchar *buf, gsize len); // for saving images
 #endif /* __DEF_email_viewer_utils_H__ */
 
 /* EOF */
index df70863..4ce72bc 100755 (executable)
@@ -80,6 +80,7 @@
 #define ICON_CONTROLBAR_MORE IMGDIR"/M02_controlbar_icon_more.png"
 
 #define EMAIL_DEFAULT_HTML "file://"DATADIR"/_email_default.html"
+#define EMAIL_VIEWER_TMP_FOLDER DIR_TMP_PREFIX"/email_viewer"
 
 #define EMAIL_VIEWER_NOC_WIDTH 710.0
 #define EMAIL_VIEWER_NOC_HIGHT 949.0
index a34835c..1191e63 100755 (executable)
@@ -210,21 +210,7 @@ static void _set_request_report(EmailViewerProp *prop, email_mail_data_t * mail_
                return;
        }
 
-       email_account_t *account = NULL;
-       if (!email_engine_get_account_full_data(mail_info->account_id, &account)) {
-               debug_log("Failed email_engine_get_account_full_data");
-               return;
-       }
-
-       if (account) {
-               account_user_data_t *ud = (account_user_data_t*)account->user_data;
-               if (ud != NULL) {
-                       debug_log("send_read_report is %d", ud->send_read_report);
-                       prop->request_report = ud->send_read_report;
-               }
-               email_free_account(&account, 1);
-               account = NULL;
-       }
+       prop->request_report = (mail_info->report_status & EMAIL_MAIL_REQUEST_MDN) ? TRUE : FALSE;
        debug_log("request_report (%d)", prop->request_report);
 }
 
index de1a945..474ad72 100755 (executable)
@@ -499,4 +499,129 @@ void _notify_mailbox_size(EmailViewerUGD *ug_data, char *size)
        ret = service_destroy(service);
        debug_log("service_destroy: %d", ret);
 }
+
+int viewer_get_filepath_from_path(char *default_path, char *origin_path, char *new_path, Eina_Bool get_new_path)
+{
+       debug_log("");
+       RETURN_VAL_IF_FAIL(STR_VALID(origin_path), EMAIL_EXT_SAVE_ERR_UNKNOWN);
+
+       int err = EMAIL_EXT_SAVE_ERR_NONE;
+       gchar tmp_path[MAX_PATH_LEN] = { 0, };
+       gchar new_filename[MAX_PATH_LEN] = { 0, };
+       gchar prefix[MAX_PATH_LEN] = { 0, };
+       gint max_length = MAX_PATH_LEN;
+
+       snprintf(prefix, sizeof(prefix), "%s", default_path);
+
+       debug_log("prefix:%s", prefix);
+
+       memset(new_path, 0, sizeof(MAX_PATH_LEN));
+       memset(tmp_path, 0, sizeof(MAX_PATH_LEN));
+
+       if (STR_LEN(tmp_path) == 0) {
+               g_sprintf(tmp_path, "%s", origin_path);
+       }
+
+       gchar *file_name = NULL;
+       gchar *file_ext = NULL;
+       gchar *file_path = email_parse_get_filepath_from_path(tmp_path);
+       email_parse_get_filename_n_ext_from_path(tmp_path, &file_name, &file_ext);
+
+       debug_log("file_name:%s", file_name);
+       debug_log("file_ext:%s", file_ext);
+
+       if (file_ext == NULL)
+               file_ext = "";
+
+       if (STR_VALID(file_name) && file_ext != NULL) {
+               debug_log("");
+               int num = 1;
+               if (STR_LEN(file_name) + STR_LEN(file_ext) > max_length - STR_LEN(prefix)) {
+                       gint available_len = max_length - STR_LEN(prefix);
+
+                       if (STR_VALID(file_ext)) {
+                               available_len -= STR_LEN(file_ext);
+                       }
+
+                       gchar *new_name = email_cut_text_by_byte_len(file_name, available_len);
+
+                       if (STR_VALID(new_name)) {
+                               g_sprintf(new_path, "%s/%s%s", prefix, new_name, file_ext);
+                               g_sprintf(new_filename, "%s%s", new_name, file_ext);
+                               g_free(new_name);       /* MUST BE. */
+                       }
+               } else {
+                       g_sprintf(new_path, "%s/%s%s", prefix, file_name, file_ext);
+               }
+
+               do {
+                       if (access(new_path, F_OK) != -1) {
+                               debug_log("file existed");
+                               if (get_new_path == EINA_TRUE) {
+                                       memset(new_path, 0, sizeof(MAX_PATH_LEN));
+                                       gint available_len = max_length - STR_LEN(prefix);
+                                       if (STR_VALID(file_ext)) {
+                                               available_len -= STR_LEN(file_ext);
+                                       }
+                                       gchar *new_name = email_cut_text_by_byte_len(file_name, available_len);
+                                       g_sprintf(new_path, "%s/%s(%d)%s", prefix, new_name, num++, file_ext);
+                                       g_free(new_name);
+                                       err = EMAIL_EXT_SAVE_ERR_ALREADY_EXIST;
+                               } else {
+                                       err = EMAIL_EXT_SAVE_ERR_ALREADY_EXIST;
+                                       break;
+                               }
+                       } else {
+                               debug_log("file path is valid.");
+                               break;
+                       }
+               } while(1);
+       }
+
+       if (STR_VALID(file_path)) {
+               g_free(file_path);      /* MUST BE. */
+       }
+
+       if (STR_VALID(file_name)) {
+               g_free(file_name);      /* MUST BE. */
+       }
+
+       if (STR_VALID(file_ext)) {
+               g_free(file_ext);       /* MUST BE. */
+       }
+
+       debug_log("new_path:%s", new_path);
+
+       return err;
+}
+
+Eina_Bool viewer_save_file(const gchar *path, const gchar *buf, gsize len)
+{
+       debug_log("path (%s)", path);
+
+       Eina_Bool success_flag = EINA_TRUE;
+
+       if (STR_LEN((gchar *)buf) >= 0 && len >= 0) {
+               int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
+               if (fd != -1) {
+                       ssize_t nwrite = write(fd, (const void *)buf, (size_t) len);
+                       debug_log("nwrite(%d)", nwrite);
+                       if (nwrite == -1) {
+                               debug_log("fail to write");
+                               success_flag = EINA_FALSE;
+                               close(fd);
+                       }
+                       close(fd);
+               } else {
+                       debug_log("fail to open");
+                       success_flag = EINA_FALSE;
+               }
+       } else {
+               debug_log("check the buf!!");
+               success_flag = EINA_FALSE;
+       }
+
+       return success_flag;
+}
+
 /* EOF */
index a87a3e8..2ccf985 100755 (executable)
@@ -16,7 +16,7 @@
 
 #include "email-viewer-webview.h"
 #include "email-viewer-js.h"
-
+#include "email-viewer-utils.h"
 #include "email-debug.h"
 #include "email-engine.h"
 #include "email-html-converter.h"
@@ -32,13 +32,19 @@ static void _webview_load_progress_cb(void *data, Evas_Object *obj, void *event_
 /* Double_Scroller */
 static void _webview_edge_top_cb(void *data, Evas_Object *obj, void *event_info);
 static void _webview_edge_bottom_cb(void *data, Evas_Object *obj, void *event_info);
-static void _webview_scroll_down_cb(void *data, Evas_Object *obj, void *event_info);
 static void _webview_scroll_up_cb(void *data, Evas_Object *obj, void *event_info);
+static void _webview_scroll_down_cb(void *data, Evas_Object *obj, void *event_info);
+static void _webview_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info);
+static void _webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info);
+static void _webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info);
 static int _send_read_report_mail(EmailViewerUGD *ug_data);
 
 extern EmailViewerUGD *_g_ug_data;
 extern ui_gadget_h _g_mailbox_ug;
 
+static int _g_pos_x;
+static int _g_pos_y;
+
 Evas_Object *viewer_get_webview(EmailViewerUGD *ug_data, gboolean has_html)
 {
        debug_log("");
@@ -59,8 +65,8 @@ Evas_Object *viewer_get_webview(EmailViewerUGD *ug_data, gboolean has_html)
        ewk_view_vertical_panning_hold_set(ug_data->webview, EINA_TRUE);
        evas_object_smart_callback_add(ug_data->webview, "edge,top", _webview_edge_top_cb, ug_data);
        evas_object_smart_callback_add(ug_data->webview, "edge,bottom", _webview_edge_bottom_cb, ug_data);
-       evas_object_smart_callback_add(ug_data->webview, "scroll,down", _webview_scroll_down_cb, ug_data);
        evas_object_smart_callback_add(ug_data->webview, "scroll,up", _webview_scroll_up_cb, ug_data);
+       evas_object_smart_callback_add(ug_data->webview, "scroll,down", _webview_scroll_down_cb, ug_data);
 
        /*evas_object_smart_callback_add(ug_data->webkit, "load,progress", _webview_progressed_cb, ug_data);*/
        evas_object_smart_callback_add(ug_data->webview, "load,committed", _webview_load_committed_cb, ug_data);
@@ -69,6 +75,11 @@ Evas_Object *viewer_get_webview(EmailViewerUGD *ug_data, gboolean has_html)
        evas_object_smart_callback_add(ug_data->webview, "load,progress", _webview_load_progress_cb, ug_data);
        evas_object_smart_callback_add(ug_data->webview, "load,error", _webview_load_error_cb, ug_data);
 
+       evas_object_smart_callback_add(ug_data->webview, "contextmenu,customize", _webview_contextmenu_customize_cb, ug_data);
+       evas_object_smart_callback_add(ug_data->webview, "contextmenu,selected", _webview_contextmenu_selected_cb, ug_data);
+
+       evas_object_event_callback_add(ug_data->webview, EVAS_CALLBACK_MOUSE_DOWN, _webview_mouse_down_cb, ug_data);
+
        evas_object_show(ug_data->webview);
 
        return ug_data->webview;
@@ -299,9 +310,22 @@ static void _webview_load_finished_cb(void *data, Evas_Object *obj, void *event_
        ewk_view_scale_range_get(ug_data->webview, &mins, &maxs);
        debug_log("mins : %f , maxs : %f", mins, maxs);
 
+       int send_read_report = 0;
+       email_account_t *account = NULL;
+       if (email_engine_get_account_full_data(ug_data->account_id, &account)) {
+               if (account) {
+                       account_user_data_t *ud = (account_user_data_t*)account->user_data;
+                       if (ud) {
+                               debug_log("send_read_report: %d", ud->send_read_report);
+                               send_read_report = ud->send_read_report;
+                       }
+                       email_free_account(&account, 1);
+                       account = NULL;
+               }
+       }
 
-       debug_log("flags_seen_field:%d, request_report:%d, report_status:%d", ug_data->email_data->mail_info->flags_seen_field, ug_data->property->request_report, ug_data->email_data->mail_info->report_status & EMAIL_MAIL_REQUEST_MDN);
-       if (!ug_data->email_data->mail_info->flags_seen_field && ug_data->property->request_report == TRUE && (ug_data->email_data->mail_info->report_status & EMAIL_MAIL_REQUEST_MDN)) {
+       debug_log("flags_seen_field:%d, send_read_report:%d, request_report:%d, report_status:%d", ug_data->email_data->mail_info->flags_seen_field, send_read_report, ug_data->property->request_report, ug_data->email_data->mail_info->report_status & EMAIL_MAIL_REQUEST_MDN);
+       if (!ug_data->email_data->mail_info->flags_seen_field && send_read_report && ug_data->property->request_report == TRUE && (ug_data->email_data->mail_info->report_status & EMAIL_MAIL_REQUEST_MDN)) {
                int send_result = _send_read_report_mail(ug_data);
                debug_log("send_result (%d)", send_result);
                if (send_result != 1) {
@@ -380,6 +404,16 @@ static void _webview_scroll_up_cb(void *data, Evas_Object *obj, void *event_info
 //     debug_log("");
 }
 
+static void _webview_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
+{
+       debug_log("");
+
+       Evas_Event_Mouse_Down *mouse_info = (Evas_Event_Mouse_Down *)event_info;
+       debug_log("output position: [%d, %d]", mouse_info->output.x, mouse_info->output.y);
+       _g_pos_x = mouse_info->output.x;
+       _g_pos_y = mouse_info->output.y;
+}
+
 static int _send_read_report_mail(EmailViewerUGD *ug_data)
 {
        debug_log("");
@@ -422,4 +456,165 @@ static void _measure_webview_xy(EmailViewerUGD *ug_data)
 }
 #endif
 
+static void _webview_contextmenu_customize_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       debug_log("");
+
+       int i = 0, count = 0;
+       Eina_Bool isText = EINA_TRUE, isImage = EINA_FALSE;
+       Ewk_Context_Menu* contextmenu = (Ewk_Context_Menu*)event_info;
+       Ewk_Context_Menu_Item* menu_item = NULL;
+       Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
+
+       count = ewk_context_menu_item_count(contextmenu);
+       menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
+       menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
+       debug_log("menu_item_tag : %d", menu_item_tag);
+
+       switch (menu_item_tag) {
+               case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB: // text selection
+               isText = EINA_TRUE;
+               break;
+               case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK:       // image or link selection
+               isText = EINA_FALSE;
+               isImage = EINA_TRUE;
+               break;
+               default:
+                       debug_log("No context menu");
+                       return;
+       }
+
+       for (i = 0; i < count; i++) {
+               menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
+               menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
+               debug_log("menu_item_tag in for: %d", menu_item_tag);
+               if (menu_item_tag == EWK_CONTEXT_MENU_ITEM_TAG_TEXT_SELECTION_MODE) { // It is not an image.
+                       isImage = EINA_FALSE;
+               }
+               ewk_context_menu_item_remove(contextmenu, menu_item);
+       }
+
+       if (isText == EINA_TRUE) {
+               ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
+//             ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 4, _("IDS_EMAIL_OPT_SHARE"), EINA_TRUE);
+               ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
+       } else {
+               if (isImage == EINA_TRUE) {
+                       ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD, _("IDS_EMAIL_OPT_COPY_IMAGE"), EINA_TRUE);
+                       ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 1, _("IDS_EMAIL_OPT_SAVE_IMAGE"), EINA_TRUE);
+                       ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 2, _("IDS_EMAIL_OPT_VIEW_IMAGE"), EINA_TRUE);
+               }
+       }
+}
+
+static void _webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info)
+{
+       debug_log("");
+
+       EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
+
+       Ewk_Context_Menu_Item* menu_item = (Ewk_Context_Menu_Item*)event_info;
+       Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
+
+       int img_buf_len = 0;
+       gchar *img_buf = NULL;
+       char *img_url = NULL;
+       Ewk_Hit_Test *ewk_hit_test = NULL;
+       gchar new_path[MAX_PATH_LEN] = { 0, };
+
+       debug_log("menu_item : %d", menu_item);
+       menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
+       debug_log("menu_item_tag : %d", menu_item_tag);
+
+       img_url = (char *)ewk_context_menu_item_image_url_get(menu_item);
+       debug_log("View image : img_url(%s)", img_url);
+
+       if (img_url != NULL) {
+               ewk_hit_test = ewk_view_hit_test_new(ug_data->webview, _g_pos_x, _g_pos_y, EWK_HIT_TEST_RESULT_CONTEXT_IMAGE);
+
+               if (ewk_hit_test != NULL) {
+                       char *ext = NULL;
+                       img_buf = ewk_hit_test_image_buffer_get(ewk_hit_test);
+                       img_buf_len = ewk_hit_test_image_buffer_length_get(ewk_hit_test);
+                       debug_log("View image : img_buf_len(%d)", img_buf_len);
+                       ext = (char *)ewk_hit_test_image_file_name_extension_get(ewk_hit_test);
+                       debug_log("View image : ext(%s)", ext);
+               }
+       }
+
+       switch (menu_item_tag) {
+       case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG : //Smart search
+       {
+               service_h service = NULL;
+               const char *keyword = NULL;
+               keyword = ewk_view_text_selection_text_get(ug_data->webview);
+               debug_log("keyword : %s", keyword);
+
+               service_create(&service);
+               service_set_operation(service, SERVICE_OPERATION_SEARCH);
+               service_add_extra_data(service, "http://tizen.org/appcontrol/data/keyword", keyword);
+               service_send_launch_request(service, NULL, NULL);
+               service_destroy(service);
+       }
+       break;
+
+       case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 1 : //Save image
+       {
+               if (viewer_get_filepath_from_path(DIR_DEFAULT_MEDIA_PHONE"/Images", img_url, new_path, EINA_TRUE) != EMAIL_EXT_SAVE_ERR_NONE) {
+                       debug_log("file exist!");
+               }
+
+               if (viewer_save_file(new_path, img_buf, img_buf_len) == EINA_FALSE) {
+                       debug_log("viewer_save_file error!");
+               } else {
+                       char str[128] = { 0, };
+                       snprintf(str, sizeof(str), "%s", dgettext("sys_string", "IDS_COM_POP_SAVED"));
+                       int ret = status_message_post(str);
+                       if (ret)
+                               debug_log("status_message_post failed: %d", ret);
+               }
+       }
+       break;
+
+       case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 2 : // View image
+       {
+               if (viewer_get_filepath_from_path(EMAIL_VIEWER_TMP_FOLDER, img_url, new_path, EINA_FALSE) == EMAIL_EXT_SAVE_ERR_NONE) {
+                       debug_log("file existed!");
+               }
+               if (viewer_save_file(new_path, img_buf, img_buf_len) == EINA_FALSE) {
+                       debug_log("viewer_save_file error!");
+               }
+
+               int ret;
+               service_h service = NULL;
+               ret = service_create(&service);
+               debug_log("service_create: %d", ret);
+               if (!service) {
+                       debug_log("service create failed");
+                       return;
+               }
+               ret = service_set_operation(service, SERVICE_OPERATION_VIEW);
+               debug_log("service_set_operation: %d", ret);
+               ret = service_set_uri(service, new_path);
+               debug_log("service_set_uri: %d", ret);
+               ret = service_add_extra_data(service, EMAIL_BUNDLE_KEY_VIDEO_PLAYER_LAUNCH_APP, "email");
+               debug_log("service_add_extra_data: %d", ret);
+               ret = service_send_launch_request(service, NULL, NULL);
+               debug_log("service_send_launch_request: %d", ret);
+               ret = service_destroy(service);
+               debug_log("service_destroy: %d", ret);
+       }
+       break;
+
+       default:
+               debug_log("Never here!");
+       }
+
+       if (ewk_hit_test != NULL) {
+               ewk_hit_test_free(ewk_hit_test);
+               ewk_hit_test = NULL;
+       }
+}
+
+
 /* EOF */
index 9d9a860..fd34eda 100755 (executable)
@@ -137,6 +137,8 @@ static void _mbe_selected_cb(void *data, Evas_Object *obj, void *event_info);
 static void _destroy_down_progress_cb(void *data, Evas_Object *obj, void *event_info);
 
 /* Logic Functions */
+static int _viewer_create_temp_folder();
+static void _viewer_remove_temp_folder();
 static void _init_viewer_data(int account_id, int mail_id, char *srv_mail_id, EmailViewerUGD *ug_data);
 static int _init_webview_data(EmailViewerUGD *ug_data);
 static Eina_Bool _check_body_download(void *data);
@@ -528,13 +530,14 @@ static void on_destroy(ui_gadget_h ug, service_h data, void *pd)
 
        ug_data->base = NULL;
 
+       _viewer_remove_temp_folder();
+
        _dbus_receiver_remove(NULL);
        int ret = e_dbus_shutdown();
        debug_log("ret: %d", ret);
 
        email_engine_finalize();
 
-
        debug_log("~");
 }
 
@@ -1427,6 +1430,8 @@ void _hide_view(EmailViewerUGD *ug_data)
 
        ewk_view_uri_set(ug_data->webview, EMAIL_DEFAULT_HTML);
 
+       _viewer_remove_temp_folder();
+
        debug_log("free address info list");
        email_free_address_info_list(&(priv->addrs_info_list));
        ug_data->from_list = NULL;
@@ -2087,7 +2092,7 @@ static Evas_Object *_create_body(EmailViewerUGD *ug_data)
 
 static Evas_Object *_create_tab_bar(EmailViewerUGD *ug_data)
 {
-       debug_log("");
+       debug_log("mailbox_type:%d", ug_data->mailbox_type);
 
        EmailViewerProp *prop = ug_data->property;
        Evas_Object *obj;
@@ -2100,10 +2105,11 @@ static Evas_Object *_create_tab_bar(EmailViewerUGD *ug_data)
                int n_to_list = g_list_length(ug_data->to_list);
                int n_cc_list = g_list_length(ug_data->cc_list);
                debug_log("to:%d, cc:%d", n_to_list, n_cc_list);
-               if (n_to_list + n_cc_list >= 2)
+               if (n_to_list + n_cc_list >= 2) {
                        ug_data->reply_ctr_it = elm_toolbar_item_append(obj, ICON_REPLY, dgettext("sys_string", "IDS_COM_SK_REPLY"), _reply_option_cb, ug_data);
-               else
+               } else {
                        ug_data->reply_ctr_it = elm_toolbar_item_append(obj, ICON_REPLY, dgettext("sys_string", "IDS_COM_SK_REPLY"), _reply_cb, ug_data);
+               }
                ug_data->forward_ctr_it = elm_toolbar_item_append(obj, ICON_FORWARD, dgettext("sys_string", "IDS_COM_BODY_FORWARD"), _forward_cb, ug_data);
                ug_data->del_ctr_it = elm_toolbar_item_append(obj, ICON_DELETE, dgettext("sys_string", "IDS_COM_SK_DELETE"), _delete_cb, ug_data);
                ug_data->more_ctr_it = elm_toolbar_item_append(obj, ICON_CONTROLBAR_MORE, dgettext("sys_string", "IDS_COM_SK_MORE"), _more_cb, ug_data);
@@ -2131,7 +2137,7 @@ static Evas_Object *_create_tab_bar(EmailViewerUGD *ug_data)
 
 static Evas_Object *_update_tab_bar(EmailViewerUGD *ug_data)
 {
-       debug_log("");
+       debug_log("mailbox_type:%d", ug_data->mailbox_type);
 
        if (ug_data->mailbox_type == EMAIL_MAILBOX_TYPE_INBOX || ug_data->mailbox_type == EMAIL_MAILBOX_TYPE_SENTBOX ||
                  ug_data->mailbox_type == EMAIL_MAILBOX_TYPE_TRASH || ug_data->mailbox_type == EMAIL_MAILBOX_TYPE_SPAMBOX) {
@@ -2528,6 +2534,7 @@ static void _create_more_ctxpopup(EmailViewerUGD *ug_data)
 
                elm_ctxpopup_item_append(ug_data->con_popup, dgettext("sys_string", "IDS_COM_BODY_MOVE"), NULL, _move_cb, ug_data);
                elm_ctxpopup_item_append(ug_data->con_popup, _("IDS_EMAIL_OPT_SAVE_EMAIL_ABB"), NULL, _save_email_cb, ug_data);
+               ug_data->create_contact_arg = CONTACTUI_REQ_ADD_EMAIL;
                elm_ctxpopup_item_append(ug_data->con_popup, dgettext("sys_string", "IDS_COM_OPT_ADD_TO_CONTACTS"), NULL, _ctxpopup_add_contact_cb, prop->sender);
                ug_data->more_ctx_block_item = elm_ctxpopup_item_append(ug_data->con_popup, _("IDS_EMAIL_OPT_BLOCK"), NULL, _ctxpopup_add_block_rule_cb, prop->sender);
        }
@@ -2561,7 +2568,7 @@ static void _create_more_ctxpopup(EmailViewerUGD *ug_data)
 //     evas_object_move(ug_data->con_popup, x, y - 20);
        evas_object_geometry_get(ug_data->ctr_bar, &x, &y, &w, &h);
        debug_log("x:%d, y:%d, w:%d, h:%d, mx:%d", x, y, w, h, ((w - x) * 6) / 7);
-       evas_object_move(ug_data->con_popup, ((w - x) * 6) / 7 , y);
+       evas_object_move(ug_data->con_popup, ((w - x) * 6) / 7, y);
        evas_object_show(ug_data->con_popup);
 }
 
@@ -2587,9 +2594,9 @@ static void _create_reply_ctxpopup(EmailViewerUGD *ug_data)
        elm_ctxpopup_item_append(ug_data->con_popup, _("IDS_EMAIL_OPT_TO_SENDER_ABB"), NULL, _reply_cb, ug_data);
        elm_ctxpopup_item_append(ug_data->con_popup, _("IDS_EMAIL_OPT_TO_ALL_ABB"), NULL, _reply_all_cb, ug_data);
 
-       Evas_Coord x, y;
-       evas_pointer_canvas_xy_get(ug_data->evas, &x, &y);
-       evas_object_move(ug_data->con_popup, x, y - 20);
+       Evas_Coord x, y, w, h;
+       evas_object_geometry_get(ug_data->reply_ctr_it, &x, &y, &w, &h);
+       evas_object_move(ug_data->con_popup, x + (w / 2), y);
        evas_object_show(ug_data->con_popup);
 }
 
@@ -3749,7 +3756,7 @@ static void _ctxpopup_send_email_cb(void *data, Evas_Object *obj, void *event_in
 
 static void _ctxpopup_add_contact_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       debug_log("");
+       debug_log("data(%s)", data);
        if (!data || !_g_ug_data) {
                debug_log("data is NULL");
                return;
@@ -4245,6 +4252,7 @@ static void _mbe_selected_cb(void *data, Evas_Object *obj, void *event_info)
                ug_data->ctx_block_item = elm_ctxpopup_item_append(ug_data->con_popup, _("IDS_EMAIL_OPT_BLOCK"), NULL, _ctxpopup_add_block_rule_cb, addrs_info->address);
                _delete_contacts_list(contact_list_item);
        } else {
+               ug_data->create_contact_arg = CONTACTUI_REQ_ADD_EMAIL;
                elm_ctxpopup_item_append(ug_data->con_popup, dgettext("sys_string", "IDS_COM_OPT_ADD_TO_CONTACTS"), NULL, _ctxpopup_add_contact_cb, addrs_info->address);
                elm_ctxpopup_item_append(ug_data->con_popup, _("IDS_EMAIL_OPT_SEND_EMAIL"), NULL, _ctxpopup_send_email_cb, addrs_info->address);
                ug_data->ctx_block_item = elm_ctxpopup_item_append(ug_data->con_popup, _("IDS_EMAIL_OPT_BLOCK"), NULL, _ctxpopup_add_block_rule_cb, addrs_info->address);
@@ -4316,6 +4324,47 @@ static void _destroy_down_progress_cb(void *data, Evas_Object *obj, void *event_
        }
 }
 
+static int _viewer_create_temp_folder()
+{
+       debug_log("");
+
+       if (!email_check_dir_exist(EMAIL_VIEWER_TMP_FOLDER)) {
+               int nErr = -1;
+               nErr = mkdir(EMAIL_VIEWER_TMP_FOLDER, 0755);
+               debug_log("errno: %d", nErr);
+               if (nErr == -1) {
+                       debug_log("Email viewer temp folder creation failed");
+                       return -1;
+               }
+       } else
+               debug_log("Email viewer temp folder already exists.");
+       return 0;
+}
+
+static void _viewer_remove_temp_folder()
+{
+       debug_log("");
+
+       struct dirent *dir_entry = NULL;
+       DIR *dir;
+       char buffer[256];
+
+       dir = opendir(EMAIL_VIEWER_TMP_FOLDER);
+       if (!dir) {
+               debug_log("Unable to open %s", EMAIL_VIEWER_TMP_FOLDER);
+               return;
+       }
+       while ((dir_entry = readdir(dir))) {
+               debug_log("%s", dir_entry->d_name);
+               if (g_strcmp0(".", dir_entry->d_name) == 0 || g_strcmp0("..", dir_entry->d_name) == 0)
+                       continue;
+               snprintf(buffer, 256, "%s/%s", EMAIL_VIEWER_TMP_FOLDER, dir_entry->d_name);
+               remove(buffer);
+       }
+       closedir(dir);
+       rmdir(EMAIL_VIEWER_TMP_FOLDER);
+}
+
 static void _init_viewer_data(int account_id, int mail_id, char *srv_mail_id, EmailViewerUGD *ug_data)
 {
        debug_log("");
@@ -4396,6 +4445,9 @@ static void _init_viewer_data(int account_id, int mail_id, char *srv_mail_id, Em
        }
 
        ug_data->option_header_opened = 0;
+
+       if (_viewer_create_temp_folder() < 0)
+               debug_log("creating email viewer temp folder is failed");
 }
 
 static int _init_webview_data(EmailViewerUGD *ug_data)
@@ -5516,7 +5568,7 @@ static char *_get_service_fail_type(int type)
                ret = _("IDS_EMAIL_POP_DOWNLOADING_ATTACHMENTS_ON_THE_MOBILE_DEVICE_IS_NOT_ALLOWED_BY_EXCHANGE_SERVER_POLICY");
                return g_strdup(ret);
        } else {
-               snprintf(str, sizeof(str), "%s (%d)", dgettext("sys_string", "IDS_COM_POP_INTERNAL_ERROR"), type);
+               snprintf(str, sizeof(str), "%s (%d)", dgettext("sys_string", "IDS_COM_POP_UNKNOWN_ERROR_OCCURRED"), type);
                return g_strdup(str);
        }
 }