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://www.tizenopensource.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.
18 #include <media_content.h>
20 #include "email-viewer-webview.h"
21 #include "email-viewer-utils.h"
22 #include "email-debug.h"
23 #include "email-engine.h"
24 #include "email-html-converter.h"
26 static void _webview_load_finished_cb(void *data, Evas_Object *obj, void *event_info);
27 static void _webview_load_error_cb(void *data, Evas_Object *obj, void *event_info);
28 static void _webview_load_committed_cb(void *data, Evas_Object *obj, void *event_info);
29 static void _webview_load_noemptylayout_finished_cb(void *data, Evas_Object *obj, void *event_info);
30 static void _webview_load_progress_cb(void *data, Evas_Object *obj, void *event_info);
33 static void _webview_edge_top_cb(void *data, Evas_Object *obj, void *event_info);
34 static void _webview_edge_bottom_cb(void *data, Evas_Object *obj, void *event_info);
35 static void _webview_scroll_up_cb(void *data, Evas_Object *obj, void *event_info);
36 static void _webview_scroll_down_cb(void *data, Evas_Object *obj, void *event_info);
37 static void _webview_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info);
38 static void _webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info);
39 static void _webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info);
40 static int _send_read_report_mail(EmailViewerUGD *ug_data);
42 extern EmailViewerUGD *_g_ug_data;
43 extern ui_gadget_h _g_mailbox_ug;
48 Evas_Object *viewer_get_webview(EmailViewerUGD *ug_data, gboolean has_html)
52 Evas_Object *ewk_view = ewk_view_add(evas_object_evas_get(ug_data->win_main/*layout_main*/));
53 ug_data->webview = ewk_view;
55 Ewk_Settings *setting = ewk_view_settings_get(ewk_view);
57 ewk_settings_auto_fitting_set(setting, EINA_TRUE);
58 ewk_settings_text_zoom_enabled_set(setting, EINA_FALSE);
60 if (ewk_settings_load_remote_images_set(setting, ug_data->b_show_remote_images) == EINA_FALSE) {
61 debug_log("SET remote images is FAILED!");
65 ewk_view_vertical_panning_hold_set(ug_data->webview, EINA_TRUE);
66 evas_object_smart_callback_add(ug_data->webview, "edge,top", _webview_edge_top_cb, ug_data);
67 evas_object_smart_callback_add(ug_data->webview, "edge,bottom", _webview_edge_bottom_cb, ug_data);
68 evas_object_smart_callback_add(ug_data->webview, "scroll,up", _webview_scroll_up_cb, ug_data);
69 evas_object_smart_callback_add(ug_data->webview, "scroll,down", _webview_scroll_down_cb, ug_data);
71 evas_object_smart_callback_add(ug_data->webview, "load,committed", _webview_load_committed_cb, ug_data);
72 evas_object_smart_callback_add(ug_data->webview, "load,finished", _webview_load_finished_cb, ug_data);
73 evas_object_smart_callback_add(ug_data->webview, "load,nonemptylayout,finished", _webview_load_noemptylayout_finished_cb, ug_data);
74 evas_object_smart_callback_add(ug_data->webview, "load,progress", _webview_load_progress_cb, ug_data);
75 evas_object_smart_callback_add(ug_data->webview, "load,error", _webview_load_error_cb, ug_data);
77 evas_object_smart_callback_add(ug_data->webview, "contextmenu,customize", _webview_contextmenu_customize_cb, ug_data);
78 evas_object_smart_callback_add(ug_data->webview, "contextmenu,selected", _webview_contextmenu_selected_cb, ug_data);
80 evas_object_event_callback_add(ug_data->webview, EVAS_CALLBACK_MOUSE_DOWN, _webview_mouse_down_cb, ug_data);
82 evas_object_show(ug_data->webview);
84 return ug_data->webview;
87 void viewer_set_webview_content(EmailViewerUGD *ug_data, int reload)
92 debug_log("ug_data is NULL");
96 if (ug_data->webview_data == NULL) {
97 debug_log("webview_data is NULL");
101 EmailViewerWebview *wvd = ug_data->webview_data;
103 if (reload && (wvd->body_type == wvd->body_type_prev)) {
104 debug_log("reload current uri");
105 ewk_view_reload(ug_data->webview);
109 char tmp_file_path[MAX_PATH_LEN] = { 0, };
110 char *tmp_file_name = NULL;
113 if (wvd->body_type == BODY_TYPE_HTML) {
114 if (wvd->uri == NULL) {
115 debug_log("invalid uri");
119 /* Fix for issue - Sometimes html content of previous mail is shown
120 * Set the default html page if file size is 0 */
121 struct stat statbuf = { 0 };
122 int status = lstat(wvd->uri, &statbuf);
124 debug_log("Total file size: %d", (int)statbuf.st_size);
125 if ((int)statbuf.st_size == 0) {
126 debug_log("Set URI with default html");
127 ewk_view_url_set(ug_data->webview, EMAIL_DEFAULT_HTML);
132 snprintf(tmp_file_path, sizeof(tmp_file_path), "file://%s", wvd->uri);
133 debug_log("file://%s", wvd->uri);
134 } else if (wvd->body_type == BODY_TYPE_TEXT) {
135 /* generate temporary html file for viewing */
136 tmp_file_name = viewer_set_html_content_file(wvd);
138 snprintf(tmp_file_path, sizeof(tmp_file_path), "file://%s", tmp_file_name);
139 debug_log("file://%s", tmp_file_name);
142 debug_log("default encoding:%s", ug_data->property->charset);
143 Ewk_Settings *setting = ewk_view_settings_get(ug_data->webview);
144 ewk_settings_default_encoding_set(setting, ug_data->property->charset);
145 ewk_view_url_set(ug_data->webview, tmp_file_path);
148 char *viewer_set_html_content_file(EmailViewerWebview *wvd)
155 char *email_content = "\0";
157 tmp_file_name = EMAIL_TMP_FILE_PATH ".html";
158 unlink(tmp_file_name); /*remove previous file*/
160 email_content = wvd->text_content;
161 html = email_html_converter(email_content, wvd->charset);
162 debug_log("html:%s", html);
163 fp = fopen(tmp_file_name, "w");
172 return tmp_file_name;
175 void viewer_coords_ewk_to_evas(Evas_Object *view, int ewkX, int ewkY, int *evasX, int *evasY)
177 int scrollX, scrollY, viewX, viewY;
178 ewk_view_scroll_pos_get(view, &scrollX, &scrollY);
179 evas_object_geometry_get(view, &viewX, &viewY, NULL, NULL);
181 *evasX = ewkX - scrollX + viewX;
182 *evasY = ewkY - scrollY + viewY;
185 void viewer_coords_evas_to_ewk(Evas_Object *view, int evasX, int evasY, int *ewkX, int *ewkY)
187 debug_log("evasX:%d, evasY:%d", evasX, evasY);
188 int scrollX, scrollY, viewX, viewY;
189 ewk_view_scroll_pos_get(view, &scrollX, &scrollY);
190 evas_object_geometry_get(view, &viewX, &viewY, NULL, NULL);
191 debug_log("scrollX:%d, scrollY:%d, viewX:%d, viewY:%d", scrollX, scrollY, viewX, viewY);
193 *ewkX = evasX + scrollX - viewX;
194 *ewkY = evasY + scrollY - viewY;
197 Eina_Bool viewer_send_message(void *data)
201 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
203 if (ug_data->timer) {
204 ecore_timer_del(ug_data->timer);
205 ug_data->timer = NULL;
209 service_h service = NULL;
211 ret = service_create(&service);
212 debug_log("service_create: %d", ret);
214 debug_log("service create failed");
218 ret = service_add_extra_data(service, EMAIL_BUNDLE_KEY_MSG, EMAIL_BUNDLE_KEY_UNLOCK_LIST);
219 debug_log("service_add_extra_data: %d", ret);
221 ug_send_message(_g_mailbox_ug, service);
223 ret = service_destroy(service);
224 debug_log("service_destroy: %d", ret);
229 static Eina_Bool _loading_prog_finish_cb(void *data)
233 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
235 if (ug_data->timeout_popup) {
236 evas_object_del(ug_data->timeout_popup);
237 ug_data->timeout_popup = NULL;
240 if (ug_data->waiting_timer) {
241 ecore_timer_del(ug_data->waiting_timer);
242 ug_data->waiting_timer = NULL;
248 static void _webview_load_finished_cb(void *data, Evas_Object *obj, void *event_info)
252 debug_log("data == NULL");
256 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
258 if (_g_ug_data == NULL) {
259 debug_log("_g_ug_data == NULL");
260 evas_object_del(ug_data->timeout_popup);
261 ug_data->timeout_popup = NULL;
265 ug_data->b_load_finished = EINA_TRUE;
267 /*_measure_webview_xy(ug_data);*/
269 if (ug_data->timer) {
270 ecore_timer_del(ug_data->timer);
271 ug_data->timer = NULL;
273 ug_data->timer = ecore_timer_add(0.0, viewer_send_message, ug_data);
275 double scale, t_scale, ratio, mins, maxs;
277 scale = ewk_view_scale_get(ug_data->webview);
278 debug_log("scale is %f", scale);
280 t_scale = ewk_view_text_zoom_get(ug_data->webview);
281 debug_log("t_scale is %f", t_scale);
283 ewk_view_text_zoom_set(ug_data->webview, 2.3f/scale);
285 ewk_view_contents_size_get(ug_data->webview, &w, &h);
286 debug_log("contents width : %d, heigth : %d", w, h);
288 ewk_view_scroll_size_get(ug_data->webview, &w, &h);
289 debug_log("scroll width : %d, heigth : %d", w, h);
291 ewk_view_scroll_pos_get(ug_data->webview, &w, &h);
292 debug_log("scroll x : %d, y : %d", w, h);
294 ratio = ewk_view_device_pixel_ratio_get(ug_data->webview);
295 debug_log("ratio is %f", ratio);
297 ewk_view_scale_range_get(ug_data->webview, &mins, &maxs);
298 debug_log("mins : %f , maxs : %f", mins, maxs);
300 int send_read_report = 0;
301 email_account_t *account = NULL;
302 if (email_engine_get_account_full_data(ug_data->account_id, &account)) {
304 account_user_data_t *ud = (account_user_data_t*)account->user_data;
306 debug_log("send_read_report: %d", ud->send_read_report);
307 send_read_report = ud->send_read_report;
312 if (account != NULL) {
313 email_free_account(&account, 1);
317 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);
318 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)) {
319 int send_result = _send_read_report_mail(ug_data);
320 debug_log("send_result (%d)", send_result);
321 if (send_result != 1) {
322 debug_log("Failed to send read report mail (%s)", send_result);
326 if (ug_data->waiting_timer) {
327 ecore_timer_del(ug_data->waiting_timer);
328 ug_data->waiting_timer = NULL;
330 ug_data->waiting_timer = ecore_timer_add(0.5, _loading_prog_finish_cb, ug_data);
333 static void _webview_load_error_cb(void *data, Evas_Object *obj, void *event_info)
338 static void _webview_load_committed_cb(void *data, Evas_Object *obj, void *event_info)
343 static void _webview_load_noemptylayout_finished_cb(void *data, Evas_Object *obj, void *event_info)
348 static void _webview_load_progress_cb(void *data, Evas_Object *obj, void *event_info)
353 /* Double_Scroller */
354 static void _webview_edge_top_cb(void *data, Evas_Object *obj, void *event_info)
357 if (_g_ug_data == NULL) {
358 debug_log("_g_ug_data == NULL");
362 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
364 if (ug_data->is_webview_scrolling) {
365 debug_log("main scroller start");
366 ewk_view_vertical_panning_hold_set(ug_data->webview, EINA_TRUE); //stop
368 if (elm_widget_scroll_freeze_get(ug_data->scroller) > 0)
369 elm_object_scroll_freeze_pop(ug_data->scroller); //restart
371 /* WORKAROUND. To fix scrolling problem when screen is on the bottom of webview. (Do panning to top fast) */
373 elm_scroller_region_get(ug_data->scroller, &x, &y, &w, &h);
374 debug_log("main_scroller(x:%d, y:%d, w:%d, h:%d)", x, y, w, h);
375 elm_scroller_region_bring_in(ug_data->scroller, x, 0, w, h);
377 ug_data->is_main_scroller_scrolling = EINA_TRUE;
378 ug_data->is_webview_scrolling = EINA_FALSE;
382 static void _webview_edge_bottom_cb(void *data, Evas_Object *obj, void *event_info)
387 static void _webview_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
392 static void _webview_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
397 static void _webview_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
401 Evas_Event_Mouse_Down *mouse_info = (Evas_Event_Mouse_Down *)event_info;
402 debug_log("output position: [%d, %d]", mouse_info->output.x, mouse_info->output.y);
403 _g_pos_x = mouse_info->output.x;
404 _g_pos_y = mouse_info->output.y;
407 static int _send_read_report_mail(EmailViewerUGD *ug_data)
413 int output_receipt_mail_id = 0;
414 if ((err = email_add_read_receipt(ug_data->email_data->mail_id, &output_receipt_mail_id)) != EMAIL_ERROR_NONE) {
415 debug_log(" fail sending [%d]", err);
418 debug_log("output_receipt_mail_id of saved email = %d", output_receipt_mail_id);
422 if ((err = email_send_mail(output_receipt_mail_id, &handle)) != EMAIL_ERROR_NONE) {
423 debug_log(" fail sending [%d]", err);
426 debug_log(" finish sending");
433 static void _measure_webview_xy(EmailViewerUGD *ug_data)
438 evas_object_geometry_get(ug_data->navi_bar, &a, &b, &c, &d);
439 debug_log("navi_bar x[%d] y[%d] w[%d] h[%d]", a, b, c, d);
440 evas_object_geometry_get(ug_data->sub_ly, &a, &b, &c, &d);
441 debug_log("sub_ly x[%d] y[%d] w[%d] h[%d]", a, b, c, d);
442 evas_object_geometry_get(ug_data->ctr_bar, &a, &b, &c, &d);
443 debug_log("ctr_bar x[%d] y[%d] w[%d] h[%d]", a, b, c, d);
444 evas_object_geometry_get(ug_data->webview_bx, &a, &b, &c, &d);
445 debug_log("webview_bx x[%d] y[%d] w[%d] h[%d]", a, b, c, d);
449 static void _webview_contextmenu_customize_cb(void *data, Evas_Object *obj, void *event_info)
453 int i = 0, count = 0;
454 Eina_Bool isText = EINA_TRUE, isImage = EINA_FALSE;
455 Ewk_Context_Menu* contextmenu = (Ewk_Context_Menu*)event_info;
456 Ewk_Context_Menu_Item* menu_item = NULL;
457 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
459 count = ewk_context_menu_item_count(contextmenu);
460 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
461 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
462 debug_log("menu_item_tag : %d", menu_item_tag);
464 switch (menu_item_tag) {
465 case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB: // text selection
468 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK: // image or link selection
473 debug_log("No context menu");
477 for (i = 0; i < count; i++) {
478 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
479 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
480 debug_log("menu_item_tag in for: %d", menu_item_tag);
481 if (menu_item_tag == EWK_CONTEXT_MENU_ITEM_TAG_TEXT_SELECTION_MODE) { // It is not an image.
482 isImage = EINA_FALSE;
484 ewk_context_menu_item_remove(contextmenu, menu_item);
487 if (isText == EINA_TRUE) {
488 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
489 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
491 if (isImage == EINA_TRUE) {
492 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD, _("IDS_EMAIL_OPT_COPY_IMAGE"), EINA_TRUE);
493 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 1, _("IDS_EMAIL_OPT_SAVE_IMAGE"), EINA_TRUE);
494 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 2, _("IDS_EMAIL_OPT_VIEW_IMAGE"), EINA_TRUE);
499 static void _webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info)
503 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
505 Ewk_Context_Menu_Item* menu_item = (Ewk_Context_Menu_Item*)event_info;
506 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
508 gsize img_buf_len = 0;
509 gchar *img_buf = NULL;
510 char *img_url = NULL;
511 Ewk_Hit_Test *ewk_hit_test = NULL;
512 gchar new_path[MAX_PATH_LEN] = { 0, };
514 debug_log("menu_item : %d", menu_item);
515 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
516 debug_log("menu_item_tag : %d", menu_item_tag);
518 img_url = (char *)ewk_context_menu_item_image_url_get(menu_item);
519 debug_log("View image : img_url(%s)", img_url);
521 if (img_url != NULL) {
522 ewk_hit_test = ewk_view_hit_test_new(ug_data->webview, _g_pos_x, _g_pos_y, EWK_HIT_TEST_RESULT_CONTEXT_IMAGE);
524 if (ewk_hit_test != NULL) {
526 img_buf = ewk_hit_test_image_buffer_get(ewk_hit_test);
527 img_buf_len = ewk_hit_test_image_buffer_length_get(ewk_hit_test);
528 debug_log("View image : img_buf_len(%d)", img_buf_len);
529 ext = (char *)ewk_hit_test_image_file_name_extension_get(ewk_hit_test);
530 debug_log("View image : ext(%s)", ext);
534 switch (menu_item_tag) {
535 case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG : //Smart search
537 service_h service = NULL;
538 const char *keyword = NULL;
539 keyword = ewk_view_text_selection_text_get(ug_data->webview);
540 debug_log("keyword : %s", keyword);
542 service_create(&service);
543 service_set_operation(service, SERVICE_OPERATION_SEARCH);
544 service_add_extra_data(service, "http://tizen.org/appcontrol/data/keyword", keyword);
545 service_send_launch_request(service, NULL, NULL);
546 service_destroy(service);
550 case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 1 : //Save image
553 if (viewer_get_filepath_from_path(DIR_DEFAULT_MEDIA_PHONE"/Downloads", img_url, new_path, EINA_TRUE) != EMAIL_EXT_SAVE_ERR_NONE) {
554 debug_log("file exist!");
557 ret = media_content_connect();
559 if (viewer_save_file(new_path, img_buf, img_buf_len) == EINA_FALSE) {
560 debug_log("viewer_save_file error!");
562 char str[128] = { 0, };
563 snprintf(str, sizeof(str), "%s", dgettext("sys_string", "IDS_COM_POP_SAVED"));
564 ret = status_message_post(str);
566 debug_log("status_message_post failed: %d", ret);
567 ret = media_content_scan_file(new_path);
568 debug_log("media_content_scan_file: %d", ret);
571 ret = media_content_disconnect();
573 debug_log("media_content_disconnect() is failed!");
576 debug_log("media_content_connect() is failed!");
581 case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 2 : // View image
583 if (viewer_get_filepath_from_path(EMAIL_VIEWER_TMP_FOLDER, img_url, new_path, EINA_FALSE) == EMAIL_EXT_SAVE_ERR_NONE) {
584 debug_log("file existed!");
586 if (viewer_save_file(new_path, img_buf, img_buf_len) == EINA_FALSE) {
587 debug_log("viewer_save_file error!");
591 service_h service = NULL;
592 ret = service_create(&service);
593 debug_log("service_create: %d", ret);
595 debug_log("service create failed");
598 ret = service_set_operation(service, SERVICE_OPERATION_VIEW);
599 debug_log("service_set_operation: %d", ret);
600 ret = service_set_uri(service, new_path);
601 debug_log("service_set_uri: %d", ret);
602 ret = service_add_extra_data(service, EMAIL_BUNDLE_KEY_VIDEO_PLAYER_LAUNCH_APP, "email");
603 debug_log("service_add_extra_data: %d", ret);
604 ret = service_send_launch_request(service, NULL, NULL);
605 debug_log("service_send_launch_request: %d", ret);
606 ret = service_destroy(service);
607 debug_log("service_destroy: %d", ret);
612 debug_log("Never here!");
615 if (ewk_hit_test != NULL) {
616 ewk_hit_test_free(ewk_hit_test);