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_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info);
36 static void _webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info);
37 static void _webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info);
38 static int _send_read_report_mail(EmailViewerUGD *ug_data);
40 extern EmailViewerUGD *_g_ug_data;
41 extern ui_gadget_h _g_mailbox_ug;
46 Evas_Object *viewer_get_webview(EmailViewerUGD *ug_data, gboolean has_html)
50 Evas_Object *ewk_view = ewk_view_add(evas_object_evas_get(ug_data->win_main/*layout_main*/));
51 ug_data->webview = ewk_view;
53 Ewk_Settings *setting = ewk_view_settings_get(ewk_view);
55 ewk_settings_auto_fitting_set(setting, EINA_TRUE);
56 ewk_settings_text_zoom_enabled_set(setting, EINA_FALSE);
58 if (ewk_settings_load_remote_images_set(setting, ug_data->b_show_remote_images) == EINA_FALSE) {
59 debug_log("SET remote images is FAILED!");
63 ewk_view_vertical_panning_hold_set(ug_data->webview, EINA_TRUE);
64 evas_object_smart_callback_add(ug_data->webview, "edge,top", _webview_edge_top_cb, ug_data);
65 evas_object_smart_callback_add(ug_data->webview, "edge,bottom", _webview_edge_bottom_cb, ug_data);
67 evas_object_smart_callback_add(ug_data->webview, "load,committed", _webview_load_committed_cb, ug_data);
68 evas_object_smart_callback_add(ug_data->webview, "load,finished", _webview_load_finished_cb, ug_data);
69 evas_object_smart_callback_add(ug_data->webview, "load,nonemptylayout,finished", _webview_load_noemptylayout_finished_cb, ug_data);
70 evas_object_smart_callback_add(ug_data->webview, "load,progress", _webview_load_progress_cb, ug_data);
71 evas_object_smart_callback_add(ug_data->webview, "load,error", _webview_load_error_cb, ug_data);
73 evas_object_smart_callback_add(ug_data->webview, "contextmenu,customize", _webview_contextmenu_customize_cb, ug_data);
74 evas_object_smart_callback_add(ug_data->webview, "contextmenu,selected", _webview_contextmenu_selected_cb, ug_data);
76 evas_object_event_callback_add(ug_data->webview, EVAS_CALLBACK_MOUSE_DOWN, _webview_mouse_down_cb, ug_data);
78 evas_object_show(ug_data->webview);
80 return ug_data->webview;
83 void viewer_set_webview_content(EmailViewerUGD *ug_data, int reload)
88 debug_log("ug_data is NULL");
92 if (ug_data->webview_data == NULL) {
93 debug_log("webview_data is NULL");
97 EmailViewerWebview *wvd = ug_data->webview_data;
99 if (reload && (wvd->body_type == wvd->body_type_prev)) {
100 debug_log("reload current uri");
101 ewk_view_reload(ug_data->webview);
105 char tmp_file_path[MAX_PATH_LEN] = { 0, };
106 char *tmp_file_name = NULL;
109 if (wvd->body_type == BODY_TYPE_HTML) {
110 if (wvd->uri == NULL) {
111 debug_log("invalid uri");
115 /* Fix for issue - Sometimes html content of previous mail is shown
116 * Set the default html page if file size is 0 */
117 struct stat statbuf = { 0 };
118 int status = lstat(wvd->uri, &statbuf);
120 debug_log("Total file size: %d", (int)statbuf.st_size);
121 if ((int)statbuf.st_size == 0) {
122 debug_log("Set URI with default html");
123 ewk_view_url_set(ug_data->webview, EMAIL_DEFAULT_HTML);
128 snprintf(tmp_file_path, sizeof(tmp_file_path), "file://%s", wvd->uri);
129 debug_log("file://%s", wvd->uri);
130 } else if (wvd->body_type == BODY_TYPE_TEXT) {
131 /* generate temporary html file for viewing */
132 tmp_file_name = viewer_set_html_content_file(wvd);
134 snprintf(tmp_file_path, sizeof(tmp_file_path), "file://%s", tmp_file_name);
135 debug_log("file://%s", tmp_file_name);
138 debug_log("default encoding:%s", ug_data->property->charset);
139 Ewk_Settings *setting = ewk_view_settings_get(ug_data->webview);
140 ewk_settings_default_encoding_set(setting, ug_data->property->charset);
141 ewk_view_url_set(ug_data->webview, tmp_file_path);
144 char *viewer_set_html_content_file(EmailViewerWebview *wvd)
151 char *email_content = "\0";
153 tmp_file_name = EMAIL_TMP_FILE_PATH ".html";
154 unlink(tmp_file_name); /*remove previous file*/
156 email_content = wvd->text_content;
157 html = email_html_converter(email_content, wvd->charset);
158 debug_log("html:%s", html);
159 fp = fopen(tmp_file_name, "w");
168 return tmp_file_name;
171 void viewer_coords_ewk_to_evas(Evas_Object *view, int ewkX, int ewkY, int *evasX, int *evasY)
173 int scrollX, scrollY, viewX, viewY;
174 ewk_view_scroll_pos_get(view, &scrollX, &scrollY);
175 evas_object_geometry_get(view, &viewX, &viewY, NULL, NULL);
177 *evasX = ewkX - scrollX + viewX;
178 *evasY = ewkY - scrollY + viewY;
181 void viewer_coords_evas_to_ewk(Evas_Object *view, int evasX, int evasY, int *ewkX, int *ewkY)
183 debug_log("evasX:%d, evasY:%d", evasX, evasY);
184 int scrollX, scrollY, viewX, viewY;
185 ewk_view_scroll_pos_get(view, &scrollX, &scrollY);
186 evas_object_geometry_get(view, &viewX, &viewY, NULL, NULL);
187 debug_log("scrollX:%d, scrollY:%d, viewX:%d, viewY:%d", scrollX, scrollY, viewX, viewY);
189 *ewkX = evasX + scrollX - viewX;
190 *ewkY = evasY + scrollY - viewY;
193 Eina_Bool viewer_send_message(void *data)
197 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
199 if (ug_data->timer) {
200 ecore_timer_del(ug_data->timer);
201 ug_data->timer = NULL;
205 service_h service = NULL;
207 ret = service_create(&service);
208 debug_log("service_create: %d", ret);
210 debug_log("service create failed");
214 ret = service_add_extra_data(service, EMAIL_BUNDLE_KEY_MSG, EMAIL_BUNDLE_KEY_UNLOCK_LIST);
215 debug_log("service_add_extra_data: %d", ret);
217 ug_send_message(_g_mailbox_ug, service);
219 ret = service_destroy(service);
220 debug_log("service_destroy: %d", ret);
225 static Eina_Bool _loading_prog_finish_cb(void *data)
229 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
231 if (ug_data->timeout_popup) {
232 evas_object_del(ug_data->timeout_popup);
233 ug_data->timeout_popup = NULL;
236 if (ug_data->waiting_timer) {
237 ecore_timer_del(ug_data->waiting_timer);
238 ug_data->waiting_timer = NULL;
244 static void _webview_load_finished_cb(void *data, Evas_Object *obj, void *event_info)
248 debug_log("data == NULL");
252 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
254 if (_g_ug_data == NULL) {
255 debug_log("_g_ug_data == NULL");
256 evas_object_del(ug_data->timeout_popup);
257 ug_data->timeout_popup = NULL;
261 ug_data->b_load_finished = EINA_TRUE;
263 /*_measure_webview_xy(ug_data);*/
265 if (ug_data->timer) {
266 ecore_timer_del(ug_data->timer);
267 ug_data->timer = NULL;
269 ug_data->timer = ecore_timer_add(0.0, viewer_send_message, ug_data);
271 double scale, t_scale, ratio, mins, maxs;
273 scale = ewk_view_scale_get(ug_data->webview);
274 debug_log("scale is %f", scale);
276 t_scale = ewk_view_text_zoom_get(ug_data->webview);
277 debug_log("t_scale is %f", t_scale);
279 ewk_view_text_zoom_set(ug_data->webview, 2.3f/scale);
281 ewk_view_contents_size_get(ug_data->webview, &w, &h);
282 debug_log("contents width : %d, heigth : %d", w, h);
284 ewk_view_scroll_size_get(ug_data->webview, &w, &h);
285 debug_log("scroll width : %d, heigth : %d", w, h);
287 ewk_view_scroll_pos_get(ug_data->webview, &w, &h);
288 debug_log("scroll x : %d, y : %d", w, h);
290 ratio = ewk_view_device_pixel_ratio_get(ug_data->webview);
291 debug_log("ratio is %f", ratio);
293 ewk_view_scale_range_get(ug_data->webview, &mins, &maxs);
294 debug_log("mins : %f , maxs : %f", mins, maxs);
296 int send_read_report = 0;
297 email_account_t *account = NULL;
298 if (email_engine_get_account_full_data(ug_data->account_id, &account)) {
300 account_user_data_t *ud = (account_user_data_t*)account->user_data;
302 debug_log("send_read_report: %d", ud->send_read_report);
303 send_read_report = ud->send_read_report;
308 if (account != NULL) {
309 email_free_account(&account, 1);
313 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);
314 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)) {
315 int send_result = _send_read_report_mail(ug_data);
316 debug_log("send_result (%d)", send_result);
317 if (send_result != 1) {
318 debug_log("Failed to send read report mail (%s)", send_result);
322 if (ug_data->waiting_timer) {
323 ecore_timer_del(ug_data->waiting_timer);
324 ug_data->waiting_timer = NULL;
326 ug_data->waiting_timer = ecore_timer_add(0.5, _loading_prog_finish_cb, ug_data);
329 static void _webview_load_error_cb(void *data, Evas_Object *obj, void *event_info)
334 static void _webview_load_committed_cb(void *data, Evas_Object *obj, void *event_info)
339 static void _webview_load_noemptylayout_finished_cb(void *data, Evas_Object *obj, void *event_info)
344 static void _webview_load_progress_cb(void *data, Evas_Object *obj, void *event_info)
349 /* Double_Scroller */
350 static void _webview_edge_top_cb(void *data, Evas_Object *obj, void *event_info)
353 if (_g_ug_data == NULL) {
354 debug_log("_g_ug_data == NULL");
358 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
360 if (ug_data->is_webview_scrolling) {
361 debug_log("main scroller start");
362 ewk_view_vertical_panning_hold_set(ug_data->webview, EINA_TRUE); //stop
364 if (elm_widget_scroll_freeze_get(ug_data->scroller) > 0)
365 elm_object_scroll_freeze_pop(ug_data->scroller); //restart
367 /* WORKAROUND. To fix scrolling problem when screen is on the bottom of webview. (Do panning to top fast) */
369 elm_scroller_region_get(ug_data->scroller, &x, &y, &w, &h);
370 debug_log("main_scroller(x:%d, y:%d, w:%d, h:%d)", x, y, w, h);
371 elm_scroller_region_bring_in(ug_data->scroller, x, 0, w, h);
373 ug_data->is_main_scroller_scrolling = EINA_TRUE;
374 ug_data->is_webview_scrolling = EINA_FALSE;
378 static void _webview_edge_bottom_cb(void *data, Evas_Object *obj, void *event_info)
383 static void _webview_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
387 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
389 Evas_Event_Mouse_Down *mouse_info = (Evas_Event_Mouse_Down *)event_info;
390 debug_log("output position: [%d, %d]", mouse_info->output.x, mouse_info->output.y);
391 _g_pos_x = mouse_info->output.x;
392 _g_pos_y = mouse_info->output.y;
393 ug_data->is_long_pressed = EINA_FALSE;
396 static int _send_read_report_mail(EmailViewerUGD *ug_data)
402 int output_receipt_mail_id = 0;
403 if ((err = email_add_read_receipt(ug_data->email_data->mail_id, &output_receipt_mail_id)) != EMAIL_ERROR_NONE) {
404 debug_log(" fail sending [%d]", err);
407 debug_log("output_receipt_mail_id of saved email = %d", output_receipt_mail_id);
411 if ((err = email_send_mail(output_receipt_mail_id, &handle)) != EMAIL_ERROR_NONE) {
412 debug_log(" fail sending [%d]", err);
415 debug_log(" finish sending");
422 static void _measure_webview_xy(EmailViewerUGD *ug_data)
427 evas_object_geometry_get(ug_data->navi_bar, &a, &b, &c, &d);
428 debug_log("navi_bar x[%d] y[%d] w[%d] h[%d]", a, b, c, d);
429 evas_object_geometry_get(ug_data->sub_ly, &a, &b, &c, &d);
430 debug_log("sub_ly x[%d] y[%d] w[%d] h[%d]", a, b, c, d);
431 evas_object_geometry_get(ug_data->ctr_bar, &a, &b, &c, &d);
432 debug_log("ctr_bar x[%d] y[%d] w[%d] h[%d]", a, b, c, d);
433 evas_object_geometry_get(ug_data->webview_bx, &a, &b, &c, &d);
434 debug_log("webview_bx x[%d] y[%d] w[%d] h[%d]", a, b, c, d);
438 static void _webview_contextmenu_customize_cb(void *data, Evas_Object *obj, void *event_info)
442 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
444 int i = 0, count = 0;
445 Eina_Bool isText = EINA_TRUE, isImage = EINA_FALSE;
446 Ewk_Context_Menu* contextmenu = (Ewk_Context_Menu*)event_info;
447 Ewk_Context_Menu_Item* menu_item = NULL;
448 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
450 count = ewk_context_menu_item_count(contextmenu);
451 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
452 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
453 debug_log("menu_item_tag : %d", menu_item_tag);
455 switch (menu_item_tag) {
456 case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB: // text selection
459 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW: // fall through
460 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK: // image or link selection
465 debug_log("No context menu");
469 for (i = 0; i < count; i++) {
470 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
471 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
472 debug_log("menu_item_tag in for: %d", menu_item_tag);
473 if (menu_item_tag == EWK_CONTEXT_MENU_ITEM_TAG_TEXT_SELECTION_MODE) { // It is not an image.
474 isImage = EINA_FALSE;
476 ewk_context_menu_item_remove(contextmenu, menu_item);
479 if (isText == EINA_TRUE) {
480 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
481 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
483 if (isImage == EINA_TRUE) {
484 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD, _("IDS_EMAIL_OPT_COPY_IMAGE"), EINA_TRUE);
485 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 1, _("IDS_EMAIL_OPT_SAVE_IMAGE"), EINA_TRUE);
486 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 2, _("IDS_EMAIL_OPT_VIEW_IMAGE"), EINA_TRUE);
490 ug_data->is_long_pressed = EINA_TRUE;
493 static void _webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info)
497 EmailViewerUGD *ug_data = (EmailViewerUGD *)data;
499 Ewk_Context_Menu_Item* menu_item = (Ewk_Context_Menu_Item*)event_info;
500 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
502 gsize img_buf_len = 0;
503 gchar *img_buf = NULL;
504 char *img_url = NULL;
505 Ewk_Hit_Test *ewk_hit_test = NULL;
506 gchar new_path[MAX_PATH_LEN] = { 0, };
508 debug_log("menu_item : %d", menu_item);
509 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
510 debug_log("menu_item_tag : %d", menu_item_tag);
512 img_url = (char *)ewk_context_menu_item_image_url_get(menu_item);
513 debug_log("View image : img_url(%s)", img_url);
515 if (img_url != NULL) {
516 ewk_hit_test = ewk_view_hit_test_new(ug_data->webview, _g_pos_x, _g_pos_y, EWK_HIT_TEST_RESULT_CONTEXT_IMAGE);
518 if (ewk_hit_test != NULL) {
520 img_buf = ewk_hit_test_image_buffer_get(ewk_hit_test);
521 img_buf_len = ewk_hit_test_image_buffer_length_get(ewk_hit_test);
522 debug_log("View image : img_buf_len(%d)", img_buf_len);
523 ext = (char *)ewk_hit_test_image_file_name_extension_get(ewk_hit_test);
524 debug_log("View image : ext(%s)", ext);
528 switch (menu_item_tag) {
529 case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG : //Smart search
531 service_h service = NULL;
532 const char *keyword = NULL;
533 keyword = ewk_view_text_selection_text_get(ug_data->webview);
534 debug_log("keyword : %s", keyword);
536 service_create(&service);
537 service_set_operation(service, SERVICE_OPERATION_SEARCH);
538 service_add_extra_data(service, "http://tizen.org/appcontrol/data/keyword", keyword);
539 service_send_launch_request(service, NULL, NULL);
540 service_destroy(service);
544 case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 1 : //Save image
547 if (viewer_get_filepath_from_path(DIR_DEFAULT_MEDIA_PHONE"/Downloads", img_url, new_path, EINA_TRUE) != EMAIL_EXT_SAVE_ERR_NONE) {
548 debug_log("file exist!");
551 ret = media_content_connect();
553 if (viewer_save_file(new_path, img_buf, img_buf_len) == EINA_FALSE) {
554 debug_log("viewer_save_file error!");
556 char str[128] = { 0, };
557 snprintf(str, sizeof(str), "%s", dgettext("sys_string", "IDS_COM_POP_SAVED"));
558 ret = status_message_post(str);
560 debug_log("status_message_post failed: %d", ret);
561 ret = media_content_scan_file(new_path);
562 debug_log("media_content_scan_file: %d", ret);
565 ret = media_content_disconnect();
567 debug_log("media_content_disconnect() is failed!");
570 debug_log("media_content_connect() is failed!");
575 case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG + 2 : // View image
577 if (viewer_get_filepath_from_path(EMAIL_VIEWER_TMP_FOLDER, img_url, new_path, EINA_FALSE) == EMAIL_EXT_SAVE_ERR_NONE) {
578 debug_log("file existed!");
580 if (viewer_save_file(new_path, img_buf, img_buf_len) == EINA_FALSE) {
581 debug_log("viewer_save_file error!");
585 service_h service = NULL;
586 ret = service_create(&service);
587 debug_log("service_create: %d", ret);
589 debug_log("service create failed");
592 ret = service_set_operation(service, SERVICE_OPERATION_VIEW);
593 debug_log("service_set_operation: %d", ret);
594 ret = service_set_uri(service, new_path);
595 debug_log("service_set_uri: %d", ret);
596 ret = service_add_extra_data(service, EMAIL_BUNDLE_KEY_VIDEO_PLAYER_LAUNCH_APP, "email");
597 debug_log("service_add_extra_data: %d", ret);
598 ret = service_send_launch_request(service, NULL, NULL);
599 debug_log("service_send_launch_request: %d", ret);
600 ret = service_destroy(service);
601 debug_log("service_destroy: %d", ret);
606 debug_log("Never here!");
609 if (ewk_hit_test != NULL) {
610 ewk_hit_test_free(ewk_hit_test);