734b1e5827bebf764e05ab461dabed4ccbd9dcc0
[apps/home/message-app.git] / viewer / src / msg-ui-viewer-play-view.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
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
7  *
8  *    http://floralicense.org/license
9  *
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.
15  */
16
17 /*==================================================================================================
18  *                                                                      INCLUDE HEADERS
19  *==================================================================================================*/
20 #include "msg-ui-viewer-play-view.h"
21 #include "msg-ui-viewer-main.h"
22 #include "msg-ui-image-resource.h"
23 #include "msg-ui-viewer-utility.h"
24 #include "msg-ui-common-utility.h"
25
26 #include <msg.h>
27 #include <msg_storage.h>
28 #include <msg_transport.h>
29
30 #include <Ecore_X.h>
31 #include <glib.h>
32 #include <contacts.h>
33 #include "appsvc.h"
34 #include <sound_manager.h>
35 #include <status.h>
36
37 /*==================================================================================================
38  *                                                                      FUNCTION DECLARATIONS
39  *==================================================================================================*/
40 /* message */
41 static MSG_BOOL __msg_ui_viewer_play_view_get_message_info(void *data);
42 static Eina_List* __msg_ui_viewer_get_inserted_item_list(MSG_PLAY_DATA_S *data);
43 static Eina_List* __msg_ui_viewer_get_attach_list(MSG_PLAY_DATA_S *data);
44 static void __msg_ui_viewer_init_font_size(MSG_PLAY_DATA_S *data);
45 static void __msg_ui_viewer_vconf_changed_cb(keynode_t *key, void *data);
46
47 /* create layout */
48 static void __msg_ui_viewer_create_subject_index_layout(MSG_PLAY_DATA_S *data);
49 static MSG_BOOL __msg_ui_viewer_create_content_layout(MSG_PLAY_DATA_S *data);
50 static void __msg_ui_viewer_create_play_controller(MSG_PLAY_DATA_S *data);
51 static void __msg_ui_viewer_create_control_toolbar(MSG_PLAY_DATA_S *data);
52 static void __msg_ui_viewer_get_layout_size(MSG_PLAY_DATA_S *data, SMIL_POSITION_S *left_top, SMIL_POSITION_S *right_bottom);
53
54 /* help page genlist */
55 static char *__msg_ui_viewer_help_page_gl_text_get(void *data, Evas_Object *obj, const char *part);
56 static Evas_Object *__msg_ui_viewer_help_page_gl_content_get(void *data, Evas_Object *obj, const char *part);
57 static void __msg_ui_viewer_help_page_gl_sel(void *data, Evas_Object *obj, void *event_info);
58 static void __msg_ui_viewer_help_page_gl_del(void *data, Evas_Object *obj);
59
60 /* message details */
61 static void __msg_ui_viewer_message_details_popup_close_clicked_cb(void *data, Evas_Object *obj, void *event_info);
62
63 /*==================================================================================================
64  *                                                              FUNCTION IMPLEMENTATIONS
65  *================================================================================================*/
66 MSG_SMIL_ERROR_E msg_ui_viewer_smil_cb(SMIL_SLIDE_CLIENT_CB_PARAM_S *eventStatus, void *data)
67 {
68         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
69         MSG_UI_RETV_IF(MSG_UI_LEVEL_DEBUG, eventStatus == NULL, MSG_ERR_SMIL_UI_DISPLAY_FAIURE);
70         MSG_UI_RETV_IF(MSG_UI_LEVEL_DEBUG, data == NULL, MSG_ERR_SMIL_UI_DISPLAY_FAIURE);
71         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
72         char title_string[VIEWER_TITLE_FONT_LEN + 1] = {0, };
73         int total_page = 0;
74
75         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "clientCbEvent : %d", eventStatus->clientCbEvent);
76         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "isLastSlide : %d", eventStatus->isLastSlide);
77         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "isHelpSlide : %d", eventStatus->isHelpSlide);
78         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "pageIdx : %d", eventStatus->pageIdx);
79         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "pageCnt : %d", eventStatus->pageCnt);
80
81         viewer_play_data->smil_eventStatus = eventStatus;
82         /*update prev/next button*/
83         msg_ui_viewer_update_play_controller(viewer_play_data, MSG_VIEWER_UNKOWN);
84
85         /*for Multipart.Mixed "Slide" count info.*/
86         if (eventStatus->pageCnt == 0 && eventStatus->clientCbEvent != SMIL_RENDER_EVENT_PAGE_MEDIA_PLAY_START)
87                 total_page = eventStatus->pageCnt + 1;
88         else
89                 total_page = eventStatus->pageCnt;
90
91         /*update page index*/
92         snprintf(title_string, sizeof(title_string), "%d/%d ", eventStatus->pageIdx + 1, total_page);
93         edje_object_part_text_set(_EDJ(viewer_play_data->subject_index_layout), "page/text", title_string);
94
95         if (eventStatus->clientCbEvent == SMIL_RENDER_EVENT_LAST_PAGE_PLAY_COMPLETE && eventStatus->isLastSlide == TRUE) {
96                 MSG_VIEWER_LAUNCH_VIEW_MODE_E launchmode = MSG_VIEWER_INVALID_MODE;
97                 msg_ui_viewer_get_viewer_launchmode(viewer_play_data->viewer_main, &launchmode);
98                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "launchmode : %d", launchmode);
99
100                 if (launchmode == MSG_VIEWER_PREVIEW_MODE) {
101                         viewer_play_data->status = MSG_VIEWER_STOP;
102                         if (viewer_play_data->play_controller)
103                                 edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "play", "*");
104                         //do not delete progressbar timer, it will be removed automatically in timer callback with return value ECORE_CALLBACK_CANCEL
105                 } else if (launchmode == MSG_VIEWER_FULLVIEW_MODE) {
106                         viewer_play_data->status = MSG_VIEWER_STOP;
107                         if (viewer_play_data->play_controller)
108                                 edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "play", "*");
109                                 //do not delete progressbar timer, it will be removed automatically in timer callback with return value ECORE_CALLBACK_CANCEL
110                         if (viewer_play_data->popup) {
111                                 evas_object_del(viewer_play_data->popup);
112                                 viewer_play_data->popup = NULL;
113                                 viewer_play_data->popup_type = MSG_VIEWER_POPUP_NONE;
114                         }
115                 } else {
116                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Invalid launchmode");
117                 }
118         } else if (eventStatus->clientCbEvent == SMIL_RENDER_EVENT_PAGE_MEDIA_PLAY_START ||
119                                 eventStatus->clientCbEvent == SMIL_RENDER_EVENT_PAGE_PLAY_START) {      /*slide is playing*/
120                 double current_slide_time = 0.0;
121                 double remain_slide_time = 0.0;
122                 double remain_next_slide_time = 0.0;
123                 if (msg_smil_get_slide_time(viewer_play_data->SmilHandle, eventStatus->pageIdx, FALSE, &remain_slide_time)) {
124                         if (msg_smil_get_slide_time(viewer_play_data->SmilHandle, eventStatus->pageIdx+1, FALSE, &remain_next_slide_time))
125                                 current_slide_time = remain_slide_time - remain_next_slide_time;
126                         else
127                                 current_slide_time = remain_slide_time;
128                 }
129
130                 if (current_slide_time <= 0) {          //for infinite duration slide, duration <= 0
131                         if (viewer_play_data->play_controller_progressbar_timer)
132                                 ecore_timer_freeze(viewer_play_data->play_controller_progressbar_timer);
133                 } else {
134                         if (viewer_play_data->play_controller_progressbar_timer)
135                                 ecore_timer_thaw(viewer_play_data->play_controller_progressbar_timer);
136                 }
137
138                 //set pause icon in play controller
139                 if (viewer_play_data->play_controller)
140                         edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "pause", "*");
141
142                 viewer_play_data->status = MSG_VIEWER_PLAY;
143         } else if (eventStatus->clientCbEvent == SMIL_RENDER_EVENT_PAUSE_CURRENT_PAGE || eventStatus->clientCbEvent == SMIL_RENDER_EVENT_MOVE_PAGE_AFTER_PAUSED) {
144                 if (viewer_play_data->play_controller)
145                         edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "play", "*");
146
147                 viewer_play_data->status = MSG_VIEWER_PAUSE;
148
149                 if (viewer_play_data->play_controller_progressbar_timer)
150                         ecore_timer_freeze(viewer_play_data->play_controller_progressbar_timer);
151         } else if (eventStatus->clientCbEvent == SMIL_RENDER_EVENT_ERROR) {
152                 /*stop smil player*/
153                 if (msg_smil_on_slide_event_handler(&(viewer_play_data->SmilHandle), PLAYER_EVENT_STOP) == MSG_SMIL_SUCCESS) {
154                         if (viewer_play_data->play_controller)
155                                 edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "play", "*");
156                                 //do not delete progressbar timer, it will be removed automatically in timer callback with return value ECORE_CALLBACK_CANCEL
157                         viewer_play_data->status = MSG_VIEWER_STOP;
158                         msg_ui_viewer_update_play_controller(viewer_play_data, MSG_VIEWER_STOP);
159                 } else {
160                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_on_slide_event_handler is failed");
161                 }
162
163                 /* show popup */
164                 if (msg_common_is_connected_call()) {
165                         viewer_play_data->popup_type = MSG_VIEWER_NORMAL_POPUP;
166                         msg_ui_viewer_show_popup(viewer_play_data, viewer_play_data->main_window, dgettext(MESSAGE_PKGNAME, "IDS_MSG_POP_UNABLE_TO_PLAY_DURING_CALL"));
167                 }
168         }
169
170         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
171         return MSG_SMIL_SUCCESS;
172 }
173
174 void msg_ui_viewer_update_play_controller(void *data, MSG_VIEWER_PLAY_STATUS_E status)
175 {
176         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, data == NULL);
177         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
178         MSG_BOOL bfisrt_page = FALSE;
179         MSG_BOOL blast_page = FALSE;
180         SMIL_SLIDE_CLIENT_CB_PARAM_S *eventStatus = viewer_play_data->smil_eventStatus;
181         SMIL_SLIDE_INFO_S *slide = msg_smil_get_current_slide_info(viewer_play_data->SmilHandle);
182
183         if (status == MSG_VIEWER_STOP) {
184                 if (viewer_play_data->play_controller) {
185                         edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "next_disable", "*");
186                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Disable next_button");
187                         edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "prev_disable", "*");
188                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Disable prev_button");
189                 }
190         } else {
191                 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, eventStatus == NULL);
192                 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, slide == NULL);
193                 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, slide->commonData == NULL);
194                 if (slide->commonData->pageCnt > 0) {
195                         if (slide->pageIdx == 0)
196                                 bfisrt_page = TRUE;
197
198                         if (slide->pageIdx + 1 == slide->commonData->pageCnt)
199                                 blast_page = TRUE;
200
201                         if (bfisrt_page) {      /*first page*/
202                                 if (viewer_play_data->play_controller) {
203                                         edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "prev_disable", "*");
204                                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Disable prev_button");
205                                 }
206                         } else {
207                                 if (viewer_play_data->play_controller) {
208                                         edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "prev_enable", "*");
209                                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Enable prev_button");
210                                 }
211                         }
212
213                         if (blast_page) {        /*lastpage*/
214                                 if (viewer_play_data->play_controller) {
215                                         edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "next_disable", "*");
216                                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Disable next_button");
217                                 }
218                         } else {
219                                 if (viewer_play_data->play_controller) {
220                                         edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "next_enable", "*");
221                                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Enable next_button");
222                                 }
223                         }
224
225                         /*smil player is finished*/
226                         if (eventStatus->clientCbEvent == SMIL_RENDER_EVENT_LAST_PAGE_PLAY_COMPLETE &&
227                                         eventStatus->isLastSlide == TRUE) {
228                                 if (viewer_play_data->play_controller) {
229                                         edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "next_disable", "*");
230                                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Disable next_button");
231                                         edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "prev_disable", "*");
232                                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Disable prev_button");
233                                 }
234                         }
235                 } else {
236                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Multipart.mixed message");
237                         if (viewer_play_data->play_controller) {
238                                 edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "next_disable", "*");
239                                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Disable next_button");
240                                 edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "prev_disable", "*");
241                                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Disable prev_button");
242                         }
243                 }
244         }
245
246         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
247 }
248
249 MSG_BOOL msg_ui_viewer_command_play_pause(void *data, MSG_VIEWER_ACTION_TYPE_E action)
250 {
251         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, FALSE);
252         MSG_SMIL_ERROR_E err = MSG_SMIL_SUCCESS;
253         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
254         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "viewer_play_data->status : %d", viewer_play_data->status);
255
256         /*prevent invalid double pressing button event after launching ug or app( call, vtcall)*/
257         if (viewer_play_data->launch_cmd != MSG_VIEWER_DEFAULT_MODE) {
258                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "launch_cmd is not MSG_VIEWER_DEFAULT_MODE (%d)", viewer_play_data->launch_cmd);
259                 return FALSE;
260         }
261
262         switch(action) {
263                 case MSG_VIEWER_ACTION_TOOLBAR_PAUSE :
264                         /* fall through */
265                 case MSG_VIEWER_ACTION_AUTO_PAUSE :
266                         /* Do pause action only if current status is PLAY */
267                         if (viewer_play_data->status == MSG_VIEWER_PLAY) {
268                                 err = msg_smil_on_slide_event_handler(&(viewer_play_data->SmilHandle), PLAYER_EVENT_PAUSE);
269                                 if (err != MSG_SMIL_SUCCESS) {
270                                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_on_slide_event_handler failed! : %d", err);
271                                         return FALSE;
272                                 } else {
273                                         if (viewer_play_data->play_controller)
274                                                 edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "play", "*");
275                                         viewer_play_data->status = MSG_VIEWER_PAUSE;
276
277                                         if (viewer_play_data->play_controller_progressbar_timer)
278                                                 ecore_timer_freeze(viewer_play_data->play_controller_progressbar_timer);
279                                 }
280                         }
281                         break;
282                 case MSG_VIEWER_ACTION_TOOLBAR_PLAY :
283                         /* fall through */
284                 case MSG_VIEWER_ACTION_AUTO_PLAY :
285                         /* Do play action when play status is STOP & PAUSE */
286                         if (viewer_play_data->status == MSG_VIEWER_STOP) {
287                                 err = msg_smil_on_slide_event_handler(&(viewer_play_data->SmilHandle), PLAYER_EVENT_PLAY);
288                                 if (err != MSG_SMIL_SUCCESS) {
289                                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_on_slide_event_handler failed! : %d", err);
290                                         return FALSE;
291                                 } else {
292                                         if (viewer_play_data->play_controller) {
293                                                 edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "pause", "*");
294                                                 msg_ui_viewer_create_progressbar(viewer_play_data, 0);
295                                         }
296                                         viewer_play_data->status = MSG_VIEWER_PLAY;
297                                 }
298                         } else if (viewer_play_data->status == MSG_VIEWER_PAUSE) {
299                                 err = msg_smil_on_slide_event_handler(&(viewer_play_data->SmilHandle), PLAYER_EVENT_RESUME);
300                                 if (err != MSG_SMIL_SUCCESS) {
301                                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_on_slide_event_handler failed! : %d", err);
302                                         return FALSE;
303                                 } else {
304                                         if (viewer_play_data->play_controller)
305                                                 edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "pause", "*");
306                                         viewer_play_data->status = MSG_VIEWER_PLAY;
307
308                                         if (viewer_play_data->play_controller_progressbar_timer)
309                                                 ecore_timer_thaw(viewer_play_data->play_controller_progressbar_timer);
310                                 }
311                         }
312                         break;
313                 default :
314                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Invalid play status case");
315                         return FALSE;
316         }
317
318         /* refreshing play controller timer by button action */
319         if (action == MSG_VIEWER_ACTION_TOOLBAR_PLAY) {
320                 msg_ui_viewer_create_play_controller_timer(viewer_play_data);
321                 if (viewer_play_data->title_menu_opened)
322                         msg_ui_viewer_close_title_menu_genlist(viewer_play_data);
323
324                 viewer_play_data->auto_resume_state = true;
325         } else if (action == MSG_VIEWER_ACTION_TOOLBAR_PAUSE) {
326                 msg_ui_viewer_create_play_controller_timer(viewer_play_data);
327                 viewer_play_data->auto_resume_state = false;
328         } else {
329                 /* case for not button action */
330                 if (viewer_play_data->status == MSG_VIEWER_PLAY) {
331                         if (viewer_play_data->title_menu_opened)
332                                 msg_ui_viewer_close_title_menu_genlist(viewer_play_data);
333
334                         /* show play controller again to notify SMIL is resumed */
335                         if (viewer_play_data->play_controller && !viewer_play_data->playcontroller_opened) {
336                                 elm_object_part_content_set(viewer_play_data->play_layout, "viewer.swallow.play.controller", viewer_play_data->play_controller);
337                                 evas_object_show(viewer_play_data->play_controller);
338                                 viewer_play_data->playcontroller_opened = true;
339                                 elm_object_signal_emit(viewer_play_data->play_layout, "elm,state,blockrect,open", "");
340                                 msg_ui_viewer_create_play_controller_timer(viewer_play_data);
341                         }
342                 } else if (viewer_play_data->status == MSG_VIEWER_PAUSE) {
343                         if (viewer_play_data->previous_status == MSG_VIEWER_PLAY) {
344                                 /* show play controller again to notify SMIL is paused */
345                                 if (viewer_play_data->play_controller && !viewer_play_data->playcontroller_opened) {
346                                         elm_object_part_content_set(viewer_play_data->play_layout, "viewer.swallow.play.controller", viewer_play_data->play_controller);
347                                         evas_object_show(viewer_play_data->play_controller);
348                                         viewer_play_data->playcontroller_opened = true;
349                                         elm_object_signal_emit(viewer_play_data->play_layout, "elm,state,blockrect,open", "");
350                                         msg_ui_viewer_create_play_controller_timer(viewer_play_data);
351                                 }
352                         }
353                 }
354         }
355
356         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
357
358         return TRUE;
359 }
360
361 void msg_ui_viewer_play_view_init(void *data)
362 {
363         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
364         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
365         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
366
367         viewer_play_data->main_window = NULL;
368         viewer_play_data->navi_frame = NULL;
369         viewer_play_data->navi_item = NULL;
370         viewer_play_data->navi_title_layout= NULL;
371         viewer_play_data->title_button = NULL;
372         viewer_play_data->attach_button = NULL;
373         viewer_play_data->title_box_layout = NULL;
374         viewer_play_data->subject_index_layout = NULL;
375         viewer_play_data->play_controller = NULL;
376         viewer_play_data->play_layout = NULL;
377         viewer_play_data->help_page_gl = NULL;
378         viewer_play_data->save_attachment_gl = NULL;
379         viewer_play_data->render_entry = NULL;
380         viewer_play_data->save_button = NULL;
381         viewer_play_data->sa_check = NULL;
382         viewer_play_data->m_x = 0;
383         viewer_play_data->m_y = 0;
384         viewer_play_data->mouse_down_event_handler = NULL;
385         viewer_play_data->mouse_up_event_handler = NULL;
386         viewer_play_data->msgHandle = NULL;
387         viewer_play_data->msgID = -1;
388         viewer_play_data->launch_cmd = MSG_VIEWER_DEFAULT_MODE;
389         viewer_play_data->status = MSG_VIEWER_UNKOWN;
390         viewer_play_data->msg_t = NULL;
391         viewer_play_data->mms_t = NULL;
392         viewer_play_data->smil_eventStatus = NULL;
393         viewer_play_data->popup = NULL;
394         viewer_play_data->popup_type = MSG_VIEWER_POPUP_NONE;
395         viewer_play_data->cmd_type = MSG_VIEWER_CMD_NONE;
396         viewer_play_data->del_idler = NULL;
397         viewer_play_data->play_controller_timer = NULL;
398         viewer_play_data->ctrl_start_x = 0;
399         viewer_play_data->ctrl_start_y = 0;
400         viewer_play_data->insert_count = 0;
401         viewer_play_data->attach_count = 0;
402         viewer_play_data->insert_list = NULL;
403         viewer_play_data->attach_list = NULL;
404         viewer_play_data->title_menu_opened = 0;
405         viewer_play_data->playcontroller_opened = 0;
406         viewer_play_data->auto_resume_state = true;
407
408         viewer_play_data->title_th = elm_theme_new();
409         elm_theme_ref_set(viewer_play_data->title_th, NULL);
410         elm_theme_extension_add(viewer_play_data->title_th, MSG_CUSTOM_WINSET_EDJ);
411
412         viewer_play_data->progress_th = elm_theme_new();
413         elm_theme_ref_set(viewer_play_data->progress_th, NULL);
414         elm_theme_extension_add(viewer_play_data->progress_th, MSG_VIEWER_EDJ);
415
416         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
417 }
418
419 void msg_ui_viewer_destroy_play_view(void *data)
420 {
421         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
422         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
423         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
424         MSG_SMIL_ERROR_E err = MSG_SMIL_SUCCESS;
425
426         if (viewer_play_data->status == MSG_VIEWER_PLAY || viewer_play_data->status == MSG_VIEWER_PAUSE) {
427                 err = msg_smil_on_slide_event_handler(&(viewer_play_data->SmilHandle), PLAYER_EVENT_STOP);
428                 if (err != MSG_SMIL_SUCCESS) {
429                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_on_slide_event_handler failed! : %d", err);
430                 } else {
431                         viewer_play_data->status = MSG_VIEWER_STOP;
432                 }
433         }
434
435         if (vconf_ignore_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, __msg_ui_viewer_vconf_changed_cb) < 0) {
436                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "unregister failed in vconf_notify_key_changed with key[%s]", VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE);
437         }
438         if (vconf_ignore_key_changed(VCONFKEY_MSG_APP_FONT_SIZE, __msg_ui_viewer_vconf_changed_cb) < 0) {
439                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "unregister failed in vconf_notify_key_changed with key[%s]", VCONFKEY_MSG_APP_FONT_SIZE);
440         }
441
442         if (viewer_play_data->insert_list) {
443                 int index = 0;
444                 int ntotal = 0;
445                 ntotal = eina_list_count(viewer_play_data->insert_list);
446                 for (index = 0; index < ntotal; index++) {
447                         MSG_VIEWER_ATTACH_MEDIA_INFO_S *pMedia_info = eina_list_nth(viewer_play_data->insert_list, index);
448                         if (pMedia_info) {
449                                 free(pMedia_info);
450                                 pMedia_info = NULL;
451                         }
452                 }
453                 eina_list_free(viewer_play_data->insert_list);
454                 viewer_play_data->insert_list = NULL;
455         }
456
457         if (viewer_play_data->attach_list) {
458                 int index = 0;
459                 int ntotal = 0;
460                 ntotal = eina_list_count(viewer_play_data->attach_list);
461                 for (index = 0; index < ntotal; index++) {
462                         MSG_VIEWER_ATTACH_MEDIA_INFO_S *pAttach_info = eina_list_nth(viewer_play_data->attach_list, index);
463                         if (pAttach_info) {
464                                 free(pAttach_info);
465                                 pAttach_info = NULL;
466                         }
467                 }
468                 eina_list_free(viewer_play_data->attach_list);
469                 viewer_play_data->attach_list = NULL;
470         }
471
472         if (viewer_play_data->popup) {
473                 evas_object_del(viewer_play_data->popup);
474                 viewer_play_data->popup = NULL;
475                 viewer_play_data->popup_type = MSG_VIEWER_POPUP_NONE;
476         }
477
478         if (viewer_play_data->del_idler) {
479                 ecore_idler_del(viewer_play_data->del_idler);
480                 viewer_play_data->del_idler = NULL;
481         }
482
483         if (viewer_play_data->help_page_gl) {
484                 evas_object_del(viewer_play_data->help_page_gl);
485                 viewer_play_data->help_page_gl = NULL;
486         }
487
488         if (viewer_play_data->play_controller_timer) {
489                 ecore_timer_del(viewer_play_data->play_controller_timer);
490                 viewer_play_data->play_controller_timer = NULL;
491         }
492
493         if (viewer_play_data->play_controller_progressbar_timer) {
494                 ecore_timer_del(viewer_play_data->play_controller_progressbar_timer);
495                 viewer_play_data->play_controller_progressbar_timer = NULL;
496         }
497
498         if (viewer_play_data->title_th) {
499                 elm_theme_extension_del(viewer_play_data->title_th, MSG_CUSTOM_WINSET_EDJ);
500                 elm_theme_free(viewer_play_data->title_th);
501                 viewer_play_data->title_th = NULL;
502         }
503
504         if (viewer_play_data->progress_th) {
505                 elm_theme_extension_del(viewer_play_data->progress_th, EDJDIR"/msg_viewer.edj");
506                 elm_theme_free(viewer_play_data->progress_th);
507                 viewer_play_data->progress_th = NULL;
508         }
509
510         sound_manager_set_volume_key_type(VOLUME_KEY_TYPE_NONE);
511
512         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
513 }
514
515 void msg_ui_viewer_connect_handler(void *data)
516 {
517         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
518         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
519         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
520
521         /* connect mouse handler for flick event */
522         if (!viewer_play_data->mouse_down_event_handler)
523                 viewer_play_data->mouse_down_event_handler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, msg_ui_viewer_mouse_down_cb, (void *)viewer_play_data);
524
525         int use_volume_key = 0;
526         vconf_get_bool(VCONFKEY_MSG_APP_USE_VOLUME_KEY, &use_volume_key);
527
528         if (use_volume_key && viewer_play_data->viewer_main) {
529                 MSG_VIEWER_MAIN_DATA_S *viewer_main_data = (MSG_VIEWER_MAIN_DATA_S *)viewer_play_data->viewer_main;
530
531                 msg_ui_viewer_grab_key_setting(viewer_main_data);
532                 /* connect key handler for volume up/down */
533                 if (!viewer_main_data->volkey_release_handler)
534                         viewer_main_data->volkey_release_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, msg_ui_viewer_key_release_cb, (void *)viewer_main_data);
535
536                 if (!viewer_main_data->volkey_press_handler)
537                         viewer_main_data->volkey_press_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, msg_ui_viewer_key_press_cb, (void *)viewer_main_data);
538         }
539
540         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
541 }
542
543 void msg_ui_viewer_disconnect_handler(void *data)
544 {
545         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
546         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
547         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
548
549         if (viewer_play_data->mouse_up_event_handler) {
550                 ecore_event_handler_del(viewer_play_data->mouse_up_event_handler);
551                 viewer_play_data->mouse_up_event_handler = NULL;
552         }
553
554         if (viewer_play_data->mouse_down_event_handler) {
555                 ecore_event_handler_del(viewer_play_data->mouse_down_event_handler);
556                 viewer_play_data->mouse_down_event_handler = NULL;
557         }
558
559         if (viewer_play_data->viewer_main) {
560                 MSG_VIEWER_MAIN_DATA_S *viewer_main_data = (MSG_VIEWER_MAIN_DATA_S *)viewer_play_data->viewer_main;
561                 if (viewer_main_data->volkey_release_handler) {
562                         ecore_event_handler_del(viewer_main_data->volkey_release_handler);
563                         viewer_main_data->volkey_release_handler = NULL;
564                 }
565
566                 if (viewer_main_data->vol_up_key_longpress) {
567                         ecore_timer_del(viewer_main_data->vol_up_key_longpress);
568                         viewer_main_data->vol_up_key_longpress = NULL;
569                 }
570
571                 if (viewer_main_data->volkey_press_handler) {
572                         ecore_event_handler_del(viewer_main_data->volkey_press_handler);
573                         viewer_main_data->volkey_press_handler = NULL;
574                 }
575
576                 if (viewer_main_data->vol_down_key_longpress) {
577                         ecore_timer_del(viewer_main_data->vol_down_key_longpress);
578                         viewer_main_data->vol_down_key_longpress = NULL;
579                 }
580
581                 msg_ui_viewer_ungrab_key_setting(viewer_main_data);
582         }
583
584         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
585 }
586
587 MSG_BOOL msg_ui_viewer_create_player_view(MSG_PLAY_DATA_S *data)
588 {
589         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
590         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, FALSE);
591         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
592         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, viewer_play_data->msg_t == NULL, FALSE);
593         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, viewer_play_data->mms_t == NULL, FALSE);
594         MSG_SMIL_ERROR_E err = MSG_SMIL_SUCCESS;
595         Evas_Object *layout = NULL;
596         MSG_VIEWER_LAUNCH_VIEW_MODE_E launchmode = MSG_VIEWER_INVALID_MODE;
597
598         /*get message information like bgcolor, insert and attach count
599           *it should be called before __msg_ui_viewer_create_control_toolbar*/
600         if (__msg_ui_viewer_play_view_get_message_info(viewer_play_data) == FALSE)
601                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "__msg_ui_viewer_play_view_get_content_count is failed");
602
603         layout = msg_ui_viewer_get_main_layout(viewer_play_data->viewer_main);
604         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, layout == NULL, FALSE);
605
606         /* create naviframe */
607         if (!viewer_play_data->navi_frame) {
608                 viewer_play_data->navi_frame = msg_ui_viewer_create_navigation_layout(layout);
609                 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, viewer_play_data->navi_frame == NULL, FALSE);
610                 msg_ui_viewer_set_navi_frame(viewer_play_data->viewer_main, viewer_play_data->navi_frame);
611         } else {
612                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "navi_frame is already created");
613         }
614
615         /*create play layout*/
616         if (__msg_ui_viewer_create_content_layout(viewer_play_data) == FALSE)
617                 return FALSE;
618
619         msg_ui_viewer_get_viewer_launchmode(viewer_play_data->viewer_main, &launchmode);
620
621         /* create back button */
622         Evas_Object     *back_btn = elm_button_add(viewer_play_data->navi_frame);
623         elm_object_style_set(back_btn, "naviframe/back_btn/default");
624         evas_object_smart_callback_add(back_btn, "clicked", msg_ui_viewer_back_button_cb, (void*)viewer_play_data);
625
626         /* set title text & title button */
627         if (launchmode == MSG_VIEWER_PREVIEW_MODE) {
628                 /* create naviframe item and push */
629                 viewer_play_data->navi_item = elm_naviframe_item_push(viewer_play_data->navi_frame, dgettext(MESSAGE_PKGNAME, "IDS_MSGC_HEADER_PREVIEW"), back_btn, NULL, viewer_play_data->play_layout, NULL);
630         } else {
631                 /* create naviframe item and push */
632                 viewer_play_data->navi_item = elm_naviframe_item_push(viewer_play_data->navi_frame, NULL, back_btn, NULL, viewer_play_data->play_layout, "empty");
633
634                 /* create naviframe title layout and set */
635                 viewer_play_data->navi_title_layout = msg_ui_viewer_create_navi_title_layout(viewer_play_data);
636                 elm_object_item_part_content_set(viewer_play_data->navi_item, "title", viewer_play_data->navi_title_layout);
637                 msg_ui_viewer_set_navi_title_layout(viewer_play_data);
638         }
639
640         /* register vconf notify */
641         if (vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, __msg_ui_viewer_vconf_changed_cb, viewer_play_data) < 0) {
642                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "register failed in vconf_notify_key_changed with key[%s]", VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE);
643         }
644         if (vconf_notify_key_changed(VCONFKEY_MSG_APP_FONT_SIZE, __msg_ui_viewer_vconf_changed_cb, viewer_play_data) < 0) {
645                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "register failed in vconf_notify_key_changed with key[%s]", VCONFKEY_MSG_APP_FONT_SIZE);
646         }
647
648         /* font size set */
649         __msg_ui_viewer_init_font_size(viewer_play_data);
650         /* create subject & index layout */
651         __msg_ui_viewer_create_subject_index_layout(viewer_play_data);
652         /* create page navigator */
653         __msg_ui_viewer_create_play_controller(viewer_play_data);
654         /* create control toolbar */
655         __msg_ui_viewer_create_control_toolbar(viewer_play_data);
656         /* connect handlers */
657         msg_ui_viewer_connect_handler(viewer_play_data);
658
659         /* create smil rendering layout */
660         if (msg_smil_create_smil_player_layout(viewer_play_data->SmilHandle, viewer_play_data->play_layout) == FALSE)
661                 return FALSE;
662
663         SMIL_POSITION_S left_top = {0,};
664         SMIL_POSITION_S right_bottom = {0,};
665         __msg_ui_viewer_get_layout_size(viewer_play_data, &left_top, &right_bottom);
666
667         if (msg_smil_set_smil_player_layout_size(viewer_play_data->SmilHandle, &left_top, &right_bottom) == FALSE)
668                 return FALSE;
669
670         /*register help page show callback to renderer */
671         if (msg_smil_set_smil_player_help_page_cb(viewer_play_data->SmilHandle, msg_ui_viewer_help_page_smilrenderer_cb, (void *)viewer_play_data) == FALSE)
672                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_set_smil_player_help_page_cb is failed");
673
674         /*register change font size callback to render */
675         if (msg_smil_set_smil_player_entry_handle_cb(viewer_play_data->SmilHandle, msg_ui_viewer_set_entry_handle_cb) == FALSE)
676                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_set_smil_player_cutlink_cb is failed");
677
678         if (launchmode == MSG_VIEWER_PREVIEW_MODE) {
679                 err = msg_smil_on_slide_event_handler(&(viewer_play_data->SmilHandle), PLAYER_EVENT_PREVIEW_PLAY);
680                 if (err != MSG_SMIL_SUCCESS) {
681                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_on_slide_event_handler failed! : %d", err);
682                         if (err != MSG_ERR_SMIL_UI_DISPLAY_FAIURE)
683                                 return FALSE;
684                 }
685         } else {
686                 err = msg_smil_on_slide_event_handler(&(viewer_play_data->SmilHandle), PLAYER_EVENT_PLAY);
687                 if (err != MSG_SMIL_SUCCESS) {
688                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_on_slide_event_handler failed! : %d", err);
689                         if (err != MSG_ERR_SMIL_UI_DISPLAY_FAIURE)
690                                 return FALSE;
691                 }
692         }
693
694         if (launchmode == MSG_VIEWER_FULLVIEW_MODE) {
695                 /*set read status*/
696                 bool readStatus = FALSE;
697                 msg_get_bool_value(viewer_play_data->msg_t, MSG_MESSAGE_READ_BOOL, &readStatus);
698
699                 if (!readStatus)
700                         msg_update_read_status(viewer_play_data->msgHandle, viewer_play_data->msgID, TRUE);
701
702                 /* send read report*/
703                 int folder_id = MSG_MAX_FOLDER_ID;
704                 msg_get_int_value(viewer_play_data->msg_t, MSG_MESSAGE_FOLDER_ID_INT, &folder_id);
705                 if (folder_id == MSG_INBOX_ID) {
706                         msg_error_t err = MSG_SUCCESS;
707
708                         msg_struct_t rcvSetting_info = msg_create_struct(MSG_STRUCT_SETTING_MMS_RECV_OPT);
709                         err = msg_get_mms_recv_opt(viewer_play_data->msgHandle, rcvSetting_info);
710
711                         if (err == MSG_SUCCESS) {
712                                 bool bReadReport;
713                                 msg_get_bool_value(rcvSetting_info, MSG_MMS_RECVOPT_READ_REPORT_BOOL, &bReadReport);
714
715                                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "bsend_read_report = %d", bReadReport);
716                                 /*read report request status and sent read report result of current message will be checked by MF after calling msg_mms_send_read_report.
717                                   *So, currently ui always call msg_mms_send_read_report when setting value of send read report is on*/
718                                 if (bReadReport)
719                                         msg_mms_send_read_report(viewer_play_data->msgHandle, viewer_play_data->msgID, MSG_READ_REPORT_IS_READ);
720
721                         } else {
722                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_config is failed!");
723                         }
724                         msg_release_struct(&rcvSetting_info);
725                 }
726         }
727
728         /* set volume key type as MEDIA, not SYSTEM */
729         sound_manager_set_volume_key_type(VOLUME_KEY_TYPE_MEDIA);
730
731         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
732         return TRUE;
733 }
734
735
736 MSG_BOOL msg_ui_viewer_show_player_view(MSG_PLAY_DATA_S *data)
737 {
738         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
739         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, FALSE);
740         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
741         MSG_SMIL_ERROR_E err = MSG_SMIL_SUCCESS;
742
743         /* connect handler again*/
744         msg_ui_viewer_connect_handler(viewer_play_data);
745
746         /*change command bar*/
747         if (viewer_play_data->play_controller) {
748                 edje_object_signal_emit(_EDJ(viewer_play_data->play_controller), "pause", "*");
749                 msg_ui_viewer_create_progressbar(viewer_play_data, 0);
750         }
751
752         /*Set title string*/
753         if (!viewer_play_data->navi_title_layout)
754                 viewer_play_data->navi_title_layout = msg_ui_viewer_create_navi_title_layout(viewer_play_data);
755
756         msg_ui_viewer_set_navi_title_layout(viewer_play_data);
757
758         /*play player view*/
759         err = msg_smil_on_slide_event_handler(&(viewer_play_data->SmilHandle), PLAYER_EVENT_PLAY);
760         if (err != MSG_SMIL_SUCCESS) {
761                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_on_slide_event_handler failed! : %d", err);
762                 return FALSE;
763         }
764
765         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
766         return TRUE;
767 }
768
769 Evas_Object *msg_ui_viewer_create_navigation_layout(Evas_Object *parent)
770 {
771         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
772         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, parent == NULL, NULL);
773         Evas_Object *navi_frame = NULL;
774
775         navi_frame = elm_naviframe_add(parent);
776         elm_object_part_content_set(parent, "elm.swallow.content", navi_frame);
777         evas_object_show(navi_frame);
778
779         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
780         return navi_frame;
781 }
782
783 static void __msg_ui_viewer_init_font_size(MSG_PLAY_DATA_S *data)
784 {
785         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
786         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
787         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
788
789         int index = 0;
790         int font_size = 0;
791         int access_font_index = 0;
792         int msg_access_font_index = 0;
793
794
795         /* get msg accessibility font index */
796         if (msg_common_get_access_font_size(&msg_access_font_index) == FALSE) {
797                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_common_get_access_font_size is failed !!");
798                 msg_access_font_index = MSG_APP_FONT_SIZE_INDEX_NORMAL; /* 1 */
799         }
800
801         /* get accessibility font index */
802         if (vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &access_font_index) < 0) {
803                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE) is failed !!");
804                 access_font_index = MSG_SYS_FONT_SIZE_INDEX_NORMAL;     /* 1 */
805         }
806
807         if (msg_common_get_font_size(&index) == FALSE) {
808                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_common_get_font_size() is failed");
809                 return;
810         } else {
811                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "selected font_size index = %d", index);
812         }
813
814         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "VCONFKEY_MSG_APP_ACCESS_FONT_SIZE = %d", msg_access_font_index);
815         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE = %d", access_font_index);
816
817         if (msg_access_font_index != access_font_index) {
818                 font_size = msg_common_get_font_size_from_index(access_font_index);
819
820                 /* sync current font size as accessibility font index */
821                 if (msg_common_set_font_size(access_font_index) == FALSE)
822                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_common_set_font_size(index = %d) is failed !!", access_font_index);
823
824                 /* sync msg accessibility font size with accessibility font index */
825                 if (msg_common_set_access_font_size(access_font_index) == FALSE)
826                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "vconf_set_int(VCONFKEY_MSG_APP_ACCESS_FONT_SIZE) is failed !!, [%d]", access_font_index);
827         } else {
828                 font_size = msg_common_get_font_size_from_index(index);
829         }
830
831         viewer_play_data->font_size = font_size;
832 }
833
834 void msg_ui_viewer_set_font_size(MSG_PLAY_DATA_S *data, MSG_VIEWER_ENTRY_TYPE_E entry_type, MSG_VIEWER_FONT_CHANGE_TYPE_E change_type)
835 {
836         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
837         MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, data == NULL, "data is NULL");
838         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
839
840         int index = 0;
841         if (change_type == MSG_VIEWER_FONT_CHANGE_LOAD_SETTING) {
842                 if (msg_common_get_font_size(&index) == FALSE) {
843                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_common_get_font_size() is failed");
844                         return;
845                 } else {
846                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "selected font_size index = %d", index);
847                 }
848                 viewer_play_data->font_size = msg_common_get_font_size_from_index(index);
849         } else {
850                 index = msg_common_get_index_from_font_size(viewer_play_data->font_size);
851                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "use latest updated font, index = %d, size = %d", index, viewer_play_data->font_size);
852         }
853
854         if (viewer_play_data->render_entry) {
855                 char font_size_str[DEF_BUF_LEN_S + 1] = {0,};
856
857                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "entry type = %d", entry_type);
858
859                 if (entry_type == MSG_VIEWER_ENTRY_NORMAL_TEXT)
860                         snprintf(font_size_str, sizeof(font_size_str), "DEFAULT='font_size=%d'", viewer_play_data->font_size);
861                 else
862                         snprintf(font_size_str, sizeof(font_size_str), "DEFAULT='font_size=%d'", (viewer_play_data->font_size*4)/5);
863
864                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "font_size_str = (%s)", font_size_str);
865                 elm_entry_text_style_user_push(viewer_play_data->render_entry, font_size_str);
866         }
867 }
868
869 static void __msg_ui_viewer_vconf_changed_cb(keynode_t *key, void *data)
870 {
871         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
872         MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, data == NULL, "data is NULL");
873         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
874
875         int index = 0;
876         int font_size = 0;
877         char *key_name = NULL;
878
879         if ((key_name = vconf_keynode_get_name(key)) == NULL) {
880                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "key_name is NULL");
881                 return;
882         }
883
884         if (!strcmp(key_name, VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE)) {
885                 index = vconf_keynode_get_int(key);
886                 font_size = msg_common_get_font_size_from_index(index);
887                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "font size updated with ACCESSIBILITY TYPE, index = %d, font size = %d", index, font_size);
888
889                 viewer_play_data->font_size = font_size;
890
891                 /* sync current font size as accessibility font index */
892                 if (msg_common_set_font_size(index) == FALSE)
893                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_common_set_font_size(index = %d) is failed !!", index);
894
895                 /* sync msg accessibility font size with accessibility font index */
896                 if (msg_common_set_access_font_size(index) == FALSE)
897                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "vconf_set_int(VCONFKEY_MSG_APP_ACCESS_FONT_SIZE) is failed !!, [%d]", index);
898
899         } else if (!strcmp(key_name, VCONFKEY_MSG_APP_FONT_SIZE)) {
900                 index = vconf_keynode_get_int(key);
901                 font_size = msg_common_get_font_size_from_index(index);
902                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "font size updated with MSG TYPE, index = %d, font size = %d", index, font_size);
903
904                 viewer_play_data->font_size = font_size;
905         } else {
906                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "invalid key name");
907         }
908 }
909
910 static MSG_BOOL __msg_ui_viewer_create_content_layout(MSG_PLAY_DATA_S *data)
911 {
912         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
913         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, FALSE);
914         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
915
916         if (!viewer_play_data->play_layout) {
917                 viewer_play_data->play_layout = elm_layout_add(viewer_play_data->navi_frame);
918                 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, viewer_play_data->play_layout == NULL, FALSE);
919                 elm_layout_file_set(viewer_play_data->play_layout, MSG_VIEWER_THEME, "viewer_main");
920                 evas_object_size_hint_weight_set(viewer_play_data->play_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
921                 evas_object_show(viewer_play_data->play_layout);
922
923                 evas_object_event_callback_add(viewer_play_data->play_layout, EVAS_CALLBACK_MOUSE_DOWN, msg_ui_viewer_play_layout_mouse_down_cb, (void *)viewer_play_data);
924                 evas_object_event_callback_add(viewer_play_data->play_layout, EVAS_CALLBACK_MOUSE_UP, msg_ui_viewer_play_layout_mouse_up_cb, (void *)viewer_play_data);
925                 elm_object_signal_callback_add(viewer_play_data->play_layout, "action,clicked", "", msg_ui_viewer_play_layout_clicked_cb, (void *)viewer_play_data);
926         }
927
928         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
929         return TRUE;
930 }
931
932 static void __msg_ui_viewer_create_subject_index_layout(MSG_PLAY_DATA_S *data)
933 {
934         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
935         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
936         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
937         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, viewer_play_data->msg_t == NULL);
938         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, viewer_play_data->mms_t == NULL);
939         char strSubject[MAX_SUBJECT_LEN] = {0};
940
941         Evas_Object *layout = elm_layout_add(viewer_play_data->navi_frame);
942         elm_layout_file_set(layout, MSG_VIEWER_THEME, "subject/pageindex");
943         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
944         evas_object_show(layout);
945         viewer_play_data->subject_index_layout = layout;
946
947         /* set bg */
948         Evas_Object *bg = evas_object_rectangle_add(evas_object_evas_get(layout));
949         evas_object_color_set(bg, 248, 246, 239, 255);
950         elm_object_part_content_set(layout,  "rect/bg", bg);
951         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
952         evas_object_show(bg);
953
954         /* get subject str */
955         msg_get_str_value(viewer_play_data->msg_t, MSG_MESSAGE_SUBJECT_STR, strSubject, MAX_SUBJECT_LEN);
956         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "subject text is %s", strSubject);
957
958         if (strSubject[0] != '\0')
959                 edje_object_part_text_set(_EDJ(viewer_play_data->subject_index_layout), "subject/text", strSubject);
960
961         elm_object_part_content_set(viewer_play_data->play_layout, "viewer.swallow.subject", viewer_play_data->subject_index_layout);
962
963         /* set LOCK icon if available */
964         bool bProtected = false;
965         msg_get_bool_value(viewer_play_data->msg_t, MSG_MESSAGE_PROTECTED_BOOL, &bProtected);
966         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Lock status of current message %d", bProtected);
967         edje_object_signal_emit(_EDJ(viewer_play_data->subject_index_layout), ((bProtected) ? "lock/icon/show" : "lock/icon/hide"), "*");
968
969         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
970 }
971
972 static void __msg_ui_viewer_create_play_controller(MSG_PLAY_DATA_S *data)
973 {
974         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
975         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
976         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
977
978         Evas_Object *layout = elm_layout_add(viewer_play_data->navi_frame);
979         elm_layout_file_set(layout, MSG_VIEWER_THEME, "play_controller");
980         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
981         evas_object_show(layout);
982
983         elm_object_part_content_set(viewer_play_data->play_layout, "viewer.swallow.play.controller", layout);
984         viewer_play_data->play_controller = layout;
985         elm_object_signal_emit(viewer_play_data->play_layout, "elm,state,blockrect,open", "");
986
987         //add signal callbacks
988         edje_object_signal_callback_add(_EDJ(viewer_play_data->play_controller), "volume_clicked", "", msg_ui_viewer_volume_button_cb, (void *)viewer_play_data);
989         edje_object_signal_callback_add(_EDJ(viewer_play_data->play_controller), "prev_clicked", "", msg_ui_viewer_prev_button_cb, (void *)viewer_play_data);
990         edje_object_signal_callback_add(_EDJ(viewer_play_data->play_controller), "play_clicked", "", msg_ui_viewer_play_pause_button_cb, (void *)viewer_play_data);
991         edje_object_signal_callback_add(_EDJ(viewer_play_data->play_controller), "pause_clicked", "", msg_ui_viewer_play_pause_button_cb, (void *)viewer_play_data);
992         edje_object_signal_callback_add(_EDJ(viewer_play_data->play_controller), "next_clicked", "", msg_ui_viewer_next_button_cb, (void *)viewer_play_data);
993
994         viewer_play_data->playcontroller_opened = true;
995
996         //register timer
997         msg_ui_viewer_create_play_controller_timer(viewer_play_data);
998
999         //create progressbar
1000         msg_ui_viewer_create_progressbar(viewer_play_data, 0);
1001
1002         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1003 }
1004
1005 static void __msg_ui_viewer_create_control_toolbar(MSG_PLAY_DATA_S *data)
1006 {
1007         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1008         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
1009         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1010         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, viewer_play_data->msg_t == NULL);
1011         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, viewer_play_data->mms_t == NULL);
1012
1013         Evas_Object *btn = NULL;
1014         MSG_VIEWER_LAUNCH_VIEW_MODE_E launchmode = MSG_VIEWER_INVALID_MODE;
1015
1016         msg_ui_viewer_get_viewer_launchmode(viewer_play_data->viewer_main, &launchmode);
1017
1018         if (launchmode == MSG_VIEWER_PREVIEW_MODE) {
1019                 // TODO : EMPTY, needs to add item?
1020         } else if (launchmode == MSG_VIEWER_FULLVIEW_MODE) {
1021                 // unset and delete btn objects(init)
1022                 if (viewer_play_data->more_btn)
1023                         evas_object_del(viewer_play_data->more_btn);
1024                 elm_object_item_part_content_unset(viewer_play_data->navi_item, "toolbar_more_btn");
1025
1026                 // More button
1027                 btn = elm_button_add(viewer_play_data->navi_frame);
1028                 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, btn == NULL);
1029                 elm_object_style_set(btn, "naviframe/more/default");
1030                 elm_object_item_part_content_set(viewer_play_data->navi_item, "toolbar_more_btn", btn);
1031                 viewer_play_data->more_btn = btn;
1032
1033                 evas_object_smart_callback_add(btn, "clicked", msg_ui_viewer_more_button_cb, data);
1034         } else {
1035                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "invalid launch mode");
1036         }
1037
1038         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1039 }
1040
1041 Evas_Object *msg_ui_viewer_create_navi_title_layout(MSG_PLAY_DATA_S *data)
1042 {
1043         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1044         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, NULL);
1045         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1046
1047         Evas_Object     *title_layout = elm_layout_add(viewer_play_data->navi_frame);
1048         elm_layout_file_set(title_layout, MSG_VIEWER_THEME, "title");
1049
1050         evas_object_size_hint_weight_set(title_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1051         evas_object_size_hint_align_set(title_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1052         evas_object_show(title_layout);
1053
1054         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1055         return title_layout;
1056 }
1057
1058 void msg_ui_viewer_set_navi_title_layout(MSG_PLAY_DATA_S *data)
1059 {
1060         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1061         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
1062         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1063         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, viewer_play_data->msg_t == NULL);
1064         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, viewer_play_data->mms_t == NULL);
1065
1066         int folder_id = MSG_MAX_FOLDER_ID;
1067         char *display_name = NULL;
1068         char title_address[MAX_ADDRESS_VAL_LEN + 1] = {0,};
1069         MSG_VIEWER_LAUNCH_VIEW_MODE_E launchmode = MSG_VIEWER_INVALID_MODE;
1070
1071         msg_get_int_value(viewer_play_data->msg_t, MSG_MESSAGE_FOLDER_ID_INT, &folder_id);      //get msg folder type
1072         msg_ui_viewer_get_viewer_launchmode(viewer_play_data->viewer_main, &launchmode);
1073
1074         if (launchmode == MSG_VIEWER_PREVIEW_MODE) {
1075                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "launchmode is not applicable, current mode is %d", launchmode);
1076                 return;
1077         } else {
1078                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "folder_id = [%d]", folder_id);
1079
1080                 if (folder_id == MSG_INBOX_ID) {
1081                         viewer_play_data->title_button = elm_button_add(viewer_play_data->navi_frame);
1082                         evas_object_size_hint_weight_set(viewer_play_data->title_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1083                         evas_object_size_hint_align_set(viewer_play_data->title_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
1084
1085                         elm_object_focus_allow_set(viewer_play_data->title_button, EINA_FALSE);
1086                         elm_object_theme_set(viewer_play_data->title_button, viewer_play_data->title_th);
1087                         elm_object_style_set(viewer_play_data->title_button, "title_button");
1088
1089                         char *address = NULL;
1090                         int contact_id = 0;
1091
1092                         msg_ui_viewer_get_thread_address_nth_address(viewer_play_data, 0, &address, &contact_id);
1093
1094                         if (contact_id > 0) {
1095                                 display_name = msg_viewer_util_get_display_name_by_index(contact_id);
1096
1097                                 if (display_name) {
1098                                         snprintf(title_address, sizeof(title_address), "%s", display_name);
1099                                         free(display_name);
1100                                 } else {
1101                                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Contact added, But there is no display name");
1102                                         snprintf(title_address, sizeof(title_address), "%s", dgettext("sys_string", "IDS_COM_BODY_NO_NAME"));
1103                                 }
1104
1105                                 if (address)
1106                                         free(address);
1107                         } else {
1108                                 if (address) {
1109                                         snprintf(title_address, sizeof(title_address), "%s", address);
1110                                         free(address);
1111                                 }
1112                         }
1113
1114                         elm_object_text_set(viewer_play_data->title_button, title_address);
1115
1116                         evas_object_show(viewer_play_data->title_button);
1117                         elm_object_part_content_set(viewer_play_data->navi_title_layout, "title_btn", viewer_play_data->title_button);
1118                         evas_object_smart_callback_add(viewer_play_data->title_button, "clicked", msg_ui_viewer_title_button_clicked_cb, (void *)viewer_play_data);
1119                 } else if (folder_id == MSG_OUTBOX_ID || folder_id == MSG_SENTBOX_ID) {
1120                         viewer_play_data->title_button = elm_button_add(viewer_play_data->navi_frame);
1121                         evas_object_size_hint_weight_set(viewer_play_data->title_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1122                         evas_object_size_hint_align_set(viewer_play_data->title_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
1123
1124                         elm_object_focus_allow_set(viewer_play_data->title_button, EINA_FALSE);
1125                         elm_object_theme_set(viewer_play_data->title_button, viewer_play_data->title_th);
1126                         elm_object_style_set(viewer_play_data->title_button, "title_button");
1127
1128                         char *address = NULL;
1129                         int contact_id = 0;
1130
1131                         msg_ui_viewer_get_thread_address_nth_address(viewer_play_data, 0, &address, &contact_id);
1132
1133                         if (contact_id > 0) {
1134                                 display_name = msg_viewer_util_get_display_name_by_index(contact_id);
1135
1136                                 if (display_name) {
1137                                         snprintf(title_address, sizeof(title_address), "%s", display_name);
1138                                         free(display_name);
1139                                 } else {
1140                                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Contact added, But there is no display name");
1141                                         snprintf(title_address, sizeof(title_address), "%s", dgettext("sys_string", "IDS_COM_BODY_NO_NAME"));
1142                                 }
1143
1144                                 if (address)
1145                                         free(address);
1146                         } else {
1147                                 if (address) {
1148                                         snprintf(title_address, sizeof(title_address), "%s", address);
1149                                         free(address);
1150                                 }
1151                         }
1152
1153                         int addr_count = msg_ui_viewer_get_thread_address_count(viewer_play_data);
1154
1155                         if (addr_count == 1) {
1156                                 elm_object_text_set(viewer_play_data->title_button, title_address);
1157                         } else if (addr_count  > 1) {
1158                                 char title_text[DEF_BUF_LEN+1] = {0,};
1159                                 snprintf(title_text, sizeof(title_text), "%s +%d", title_address, addr_count-1);
1160                                 elm_object_text_set(viewer_play_data->title_button, title_text);
1161                         } else {
1162                                 elm_object_text_set(viewer_play_data->title_button, dgettext("sys_string", "IDS_COM_BODY_UNKNOWN"));
1163                         }
1164
1165                         evas_object_show(viewer_play_data->title_button);
1166                         elm_object_part_content_set(viewer_play_data->navi_title_layout, "title_btn", viewer_play_data->title_button);
1167                         evas_object_smart_callback_add(viewer_play_data->title_button, "clicked", msg_ui_viewer_title_button_clicked_cb, (void *)viewer_play_data);
1168                 } else {
1169                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Invalid type of message folder id = [%d]", folder_id);
1170                 }
1171
1172                 /* create attach button */
1173                 Evas_Object *button = elm_button_add(viewer_play_data->navi_frame);
1174                 elm_object_style_set(button, "naviframe/title_icon");
1175
1176                 Evas_Object *icon = elm_icon_add(viewer_play_data->navi_frame);
1177
1178                 if (viewer_play_data->insert_count + viewer_play_data->attach_count != 0) {
1179                         elm_object_disabled_set(button, EINA_FALSE);
1180                         elm_image_file_set(icon, MSG_IMAGES_EDJ, MSG_VIEWER_IMAGE_ATTACH_LIST_ICON);
1181                 } else {
1182                         elm_object_disabled_set(button, EINA_TRUE);
1183                         elm_image_file_set(icon, MSG_IMAGES_EDJ, MSG_VIEWER_IMAGE_ATTACH_LIST_DIM_ICON);
1184                 }
1185
1186                 elm_object_content_set(button, icon);
1187                 evas_object_smart_callback_add(button, "clicked", msg_ui_viewer_save_button_cb, viewer_play_data);
1188
1189                 evas_object_show(button);
1190                 elm_object_part_content_set(viewer_play_data->navi_title_layout, "attach_btn", button);
1191
1192                 viewer_play_data->attach_button = button;
1193         }
1194
1195         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1196 }
1197
1198 static void __msg_ui_viewer_get_layout_size(MSG_PLAY_DATA_S *data, SMIL_POSITION_S *left_top, SMIL_POSITION_S *right_bottom)
1199 {
1200         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1201         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
1202         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, left_top == NULL);
1203         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, right_bottom == NULL);
1204         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1205         int navi_frame_height = 0;
1206         int window_width = 0;
1207         int window_height = 0;
1208
1209         /*get window size*/
1210         ecore_x_window_size_get(ecore_x_window_root_first_get(), &window_width, &window_height);
1211         viewer_play_data->window_width = window_width;
1212         viewer_play_data->window_height = window_height;
1213
1214         /*get navi_frame height*/
1215         double scale = elm_config_scale_get();
1216         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "scale = %lf", scale);
1217
1218         navi_frame_height = (int)(scale * VIEWER_NAVI_FRAME_HEIGHT);
1219         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "navi_frame_height = %d", navi_frame_height);
1220
1221         left_top->x = 0;
1222         left_top->y = navi_frame_height;
1223         right_bottom->x = window_width;
1224         right_bottom->y = window_height;
1225
1226         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1227 }
1228
1229 static MSG_BOOL __msg_ui_viewer_play_view_get_message_info(void *data)
1230 {
1231         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1232         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, FALSE);
1233         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1234         int page_count = 0;
1235         int media_count = 0;
1236         int nmedia_count = 0;
1237         int bgColor = 0;
1238
1239         /*get the SMIL content*/
1240         if (!viewer_play_data->mms_t) {
1241                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "mms data struct is null");
1242                 return FALSE;
1243         }
1244
1245         /*get bgcolor*/
1246         msg_get_int_value(viewer_play_data->mms_t, MSG_MMS_ROOTLAYOUT_BGCOLOR_INT, &bgColor);
1247         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "viewer_play_data->bgcolor = 0x%x", bgColor);
1248
1249         /*get attach count*/
1250         msg_list_handle_t attachlist_info = NULL;
1251         msg_get_list_handle(viewer_play_data->mms_t, MSG_MMS_ATTACH_LIST_HND, (void **)&attachlist_info);
1252         viewer_play_data->attach_count= msg_list_length(attachlist_info);
1253
1254         /*get attach list */
1255         viewer_play_data->attach_list = __msg_ui_viewer_get_attach_list(viewer_play_data);
1256
1257         /*get insert count*/
1258         msg_list_handle_t pagelist_info = NULL;
1259         msg_get_list_handle(viewer_play_data->mms_t, MSG_MMS_PAGE_LIST_HND, (void **)&pagelist_info);
1260         page_count = msg_list_length(pagelist_info);
1261
1262         if (page_count) {
1263                 int page_idx = 0;
1264                 for (page_idx = 0; page_idx < page_count; ++page_idx) {
1265                         msg_struct_t page_info = NULL;
1266                         page_info = (msg_struct_t)msg_list_nth_data(pagelist_info, page_idx);
1267
1268                         if (!page_info) {
1269                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "page_info is NULL");
1270                                 return FALSE;
1271                         }
1272
1273                         msg_list_handle_t medialist_info = NULL;
1274                         msg_get_list_handle(page_info, MSG_MMS_PAGE_MEDIA_LIST_HND, (void **)&medialist_info);
1275                         media_count = msg_list_length(medialist_info);
1276                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "page = %d, page media count = %d", page_idx, media_count);
1277
1278                         int media_idx = 0;
1279                         for (media_idx = 0; media_idx < media_count; ++media_idx) {
1280                                 int mediaType;
1281                                 msg_struct_t media_info = NULL;
1282                                 media_info = (msg_struct_t)msg_list_nth_data(medialist_info, media_idx);
1283
1284                                 if (!media_info) {
1285                                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "%d pMedia is NULL", media_idx);
1286                                         continue;
1287                                 }
1288
1289                                 msg_get_int_value(media_info, MSG_MMS_MEDIA_TYPE_INT, &mediaType);
1290
1291                                 if (mediaType == MMS_SMIL_MEDIA_TEXT)
1292                                         continue;
1293
1294                                 nmedia_count++;
1295                         }
1296                 }
1297         }
1298         viewer_play_data->insert_count = nmedia_count;
1299
1300         /* get insert item list */
1301         viewer_play_data->insert_list = __msg_ui_viewer_get_inserted_item_list(viewer_play_data);
1302         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "insert count : %d, attach count : %d", viewer_play_data->insert_count, viewer_play_data->attach_count);
1303
1304         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1305
1306         return TRUE;
1307 }
1308
1309 int msg_ui_viewer_get_thread_address_count(MSG_PLAY_DATA_S *data)
1310 {
1311         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, -1);
1312         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1313         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, viewer_play_data->msg_t == NULL, -1);
1314         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, viewer_play_data->mms_t == NULL, -1);
1315         msg_struct_list_s addrList;
1316         int thread_id;
1317         msg_error_t err = MSG_SUCCESS;
1318         int count = 0;
1319
1320         /* get address list(thread) */
1321         memset(&addrList, 0x00, sizeof(msg_struct_list_s));
1322         msg_get_int_value(viewer_play_data->msg_t, MSG_MESSAGE_THREAD_ID_INT, &thread_id);
1323
1324         err = msg_get_address_list(viewer_play_data->msgHandle, thread_id, &addrList);
1325         if (err != MSG_SUCCESS) {
1326                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_address_list has failed");
1327                 return -1;
1328         }
1329
1330         count = addrList.nCount;
1331
1332         msg_release_list_struct(&addrList);
1333
1334         return count;
1335 }
1336
1337 void msg_ui_viewer_get_thread_address_nth_address(MSG_PLAY_DATA_S *data, int number, char **address, int *contact_id)
1338 {
1339         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1340         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
1341         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1342         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, viewer_play_data->msg_t == NULL);
1343         msg_struct_list_s addrList;
1344         int thread_id;
1345         msg_error_t err = MSG_SUCCESS;
1346         char buf_address[MAX_ADDRESS_VAL_LEN+1] = {0,};
1347
1348         /* get address list(thread) */
1349         memset(&addrList, 0x00, sizeof(msg_struct_list_s));
1350         msg_get_int_value(viewer_play_data->msg_t, MSG_MESSAGE_THREAD_ID_INT, &thread_id);
1351
1352         err = msg_get_address_list(viewer_play_data->msgHandle, thread_id, &addrList);
1353         if (err != MSG_SUCCESS) {
1354                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_address_list has failed");
1355                 return;
1356         }
1357
1358         /* get Nth address */
1359         if (addrList.msg_struct_info[number]) {
1360                 err = msg_get_str_value(addrList.msg_struct_info[number], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, buf_address, MAX_ADDRESS_VAL_LEN);
1361                 if (err != MSG_SUCCESS) {
1362                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_str_value() is failed");
1363                         msg_release_list_struct(&addrList);
1364                         return;
1365                 }
1366
1367                 err = msg_get_int_value(addrList.msg_struct_info[number], MSG_ADDRESS_INFO_CONTACT_ID_INT, contact_id);
1368                 if (err != MSG_SUCCESS) {
1369                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_int_value() is failed");
1370                         msg_release_list_struct(&addrList);
1371                         return;
1372                 }
1373         } else {
1374                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "addrList.msg_struct_info[%d] is NULL", number);
1375                 msg_release_list_struct(&addrList);
1376                 return;
1377         }
1378
1379         msg_release_list_struct(&addrList);
1380
1381         *address = (char *)calloc(1, strlen(buf_address) + 1);
1382         if (*address == NULL) {
1383                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "*address is NULL");
1384                 return;
1385         }
1386
1387         strncpy(*address, buf_address, strlen(buf_address));
1388
1389         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "address is %s", *address);
1390         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "contact_id is %d", *contact_id);
1391 }
1392
1393 static Eina_List* __msg_ui_viewer_get_inserted_item_list(MSG_PLAY_DATA_S *data)
1394 {
1395         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1396         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, NULL);
1397         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1398
1399         int page_idx = 0;
1400         int page_count = 0;
1401         int media_count = 0;
1402         int insertCnt = 0;
1403         int drmType = 0;
1404         Eina_List *insert_list = NULL;
1405
1406         char strFileName[MSG_FILENAME_LEN_MAX] = {0,};
1407         char strFilePath[MSG_FILEPATH_LEN_MAX] = {0,};
1408
1409         /*get insert count*/
1410         msg_list_handle_t pagelist_info = NULL;
1411         msg_get_list_handle(viewer_play_data->mms_t, MSG_MMS_PAGE_LIST_HND, (void **)&pagelist_info);
1412         page_count = msg_list_length(pagelist_info);
1413
1414         for (page_idx = 0; page_idx < page_count; ++page_idx) {
1415                 msg_struct_t page_info = NULL;
1416                 page_info = (msg_struct_t)msg_list_nth_data(pagelist_info, page_idx);
1417                 if (!page_info) {
1418                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "page_info is NULL");
1419                         continue;
1420                 }
1421
1422                 msg_list_handle_t medialist_info = NULL;
1423                 msg_get_list_handle(page_info, MSG_MMS_PAGE_MEDIA_LIST_HND, (void **)&medialist_info);
1424                 media_count = msg_list_length(medialist_info);
1425                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "page = %d, page media count = %d", page_idx, media_count);
1426
1427                 int media_idx = 0;
1428                 for (media_idx = 0; media_idx < media_count; ++media_idx) {
1429                         int mediaType;
1430                         msg_struct_t media_info = NULL;
1431                         media_info = (msg_struct_t)msg_list_nth_data(medialist_info, media_idx);
1432
1433                         if (!media_info) {
1434                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "%d media_info is NULL", media_idx);
1435                                 continue;
1436                         }
1437
1438                         msg_get_int_value(media_info, MSG_MMS_MEDIA_TYPE_INT, &mediaType);
1439
1440                         if (mediaType == MMS_SMIL_MEDIA_TEXT) {
1441                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "%d pMedia is TEXT type, skip adding", media_idx);
1442                                 continue;
1443                         }
1444
1445                         bzero(strFileName, sizeof(strFileName));
1446                         bzero(strFilePath, sizeof(strFilePath));
1447
1448                         msg_get_str_value(media_info, MSG_MMS_MEDIA_FILENAME_STR, strFileName, sizeof(strFileName));
1449                         msg_get_str_value(media_info, MSG_MMS_MEDIA_FILEPATH_STR, strFilePath, sizeof(strFilePath));
1450
1451                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "insert media file name: %s", strFileName);
1452                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "attachment file path: %s", strFilePath);
1453
1454                         MSG_VIEWER_ATTACH_MEDIA_INFO_S *pInsert_info = (MSG_VIEWER_ATTACH_MEDIA_INFO_S *)calloc(1, sizeof(MSG_VIEWER_ATTACH_MEDIA_INFO_S));
1455                         if (pInsert_info == NULL) {
1456                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "calloc is failed");
1457                                 if (insert_list)
1458                                         goto FREE_LIST;
1459                                 else
1460                                         return NULL;
1461                         } else {
1462                                 if (strlen(strFileName)) {
1463                                         strncpy(pInsert_info->pfile_name, strFileName, MSG_VIEWER_FILENAME_MAX_LEN);
1464                                 } else {
1465                                         const char *file_name = NULL;
1466                                         file_name = ecore_file_file_get(strFilePath);
1467                                         if (file_name)
1468                                                 strncpy(pInsert_info->pfile_name, file_name, MSG_VIEWER_FILENAME_MAX_LEN);
1469                                         else
1470                                                 strncpy(pInsert_info->pfile_name, strFilePath, MSG_VIEWER_FILENAME_MAX_LEN);
1471                                 }
1472
1473                                 strncpy(pInsert_info->pfile_path, strFilePath, MSG_VIEWER_FILEPATH_MAX_LEN);
1474
1475                                 pInsert_info->pfile_size = ecore_file_size(strFilePath);
1476
1477                                 msg_get_int_value(media_info, MSG_MMS_MEDIA_DRM_TYPE_INT, &drmType);
1478
1479                                 if (drmType != MSG_DRM_TYPE_NONE) {
1480                                         pInsert_info->media_type = MSG_VIEWER_MEDIA_DRM;
1481                                 } else {
1482                                         switch (mediaType) {
1483                                                 case MMS_SMIL_MEDIA_IMG:
1484                                                         pInsert_info->media_type = MSG_VIEWER_MEDIA_IMG;
1485                                                         break;
1486                                                 case MMS_SMIL_MEDIA_AUDIO:
1487                                                         pInsert_info->media_type = MSG_VIEWER_MEDIA_AUDIO;
1488                                                         break;
1489                                                 case MMS_SMIL_MEDIA_VIDEO:
1490                                                         pInsert_info->media_type = MSG_VIEWER_MEDIA_VIDEO;
1491                                                         break;
1492                                                 case MMS_SMIL_MEDIA_ANIMATE:
1493                                                         pInsert_info->media_type = MSG_VIEWER_MEDIA_ANIMATE;
1494                                                         break;
1495                                                 case MMS_SMIL_MEDIA_IMG_OR_VIDEO:
1496                                                         pInsert_info->media_type = MSG_VIEWER_MEDIA_IMG_OR_VIDEO;
1497                                                         break;
1498                                                 default:
1499                                                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "%d type is not handled in switch!");
1500                                                         pInsert_info->media_type = MSG_VIEWER_MEDIA_ATTACH;             // set attach type, it's better to set attach type, not to set invalid type
1501                                                         break;
1502                                         }
1503                                 }
1504                                 pInsert_info->viewer_play_data = viewer_play_data;
1505
1506                                 /*append insert item list*/
1507                                 insert_list = eina_list_append(insert_list, pInsert_info);
1508                                 insertCnt++;
1509                         }
1510                 }
1511         }
1512
1513         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Total %d insert item(s) added", insertCnt);
1514         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1515
1516         return insert_list;
1517 FREE_LIST:
1518         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Free insert item list");
1519         if (insert_list) {
1520                 int index = 0;
1521                 int ntotal = 0;
1522                 ntotal = eina_list_count(insert_list);
1523                 for (index = 0; index < ntotal; index++) {
1524                         MSG_VIEWER_ATTACH_MEDIA_INFO_S *pMedia_info = eina_list_nth(insert_list, index);
1525                         if (pMedia_info) {
1526                                 free(pMedia_info);
1527                                 pMedia_info = NULL;
1528                         }
1529                 }
1530                 eina_list_free(insert_list);
1531                 insert_list = NULL;
1532         }
1533         return NULL;
1534 }
1535
1536 static Eina_List* __msg_ui_viewer_get_attach_list(MSG_PLAY_DATA_S *data)
1537 {
1538         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1539         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, NULL);
1540         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1541
1542         /*get attached content list*/
1543         int attach_idx = 0;
1544         int attach_count = 0;
1545         Eina_List *attach_list = NULL;
1546         char strFileName[MSG_FILENAME_LEN_MAX] = {0,};
1547         char strFilePath[MSG_FILEPATH_LEN_MAX] = {0,};
1548
1549         /*get attach count*/
1550         msg_list_handle_t attachlist_info = NULL;
1551         msg_get_list_handle(viewer_play_data->mms_t, MSG_MMS_ATTACH_LIST_HND, (void **)&attachlist_info);
1552         attach_count = msg_list_length(attachlist_info);
1553
1554         for (attach_idx = 0; attach_idx < attach_count; ++attach_idx) {
1555                 msg_struct_t attach_info = NULL;
1556
1557                 attach_info = (msg_struct_t)msg_list_nth_data(attachlist_info, attach_idx);
1558
1559                 if (attach_info == NULL) {
1560                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "pAttach is NULL");
1561                         continue;
1562                 }  else {
1563                         bzero(strFileName, sizeof(strFileName));
1564                         bzero(strFilePath, sizeof(strFilePath));
1565
1566                         msg_get_str_value(attach_info, MSG_MMS_ATTACH_FILENAME_STR, strFileName, sizeof(strFileName));
1567                         msg_get_str_value(attach_info, MSG_MMS_ATTACH_FILEPATH_STR, strFilePath, sizeof(strFilePath));
1568
1569                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "attachment file name: %s", strFileName);
1570                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "attachment file path: %s", strFilePath);
1571
1572                         MSG_VIEWER_ATTACH_MEDIA_INFO_S *pAttach_info = (MSG_VIEWER_ATTACH_MEDIA_INFO_S *)calloc(1, sizeof(MSG_VIEWER_ATTACH_MEDIA_INFO_S));
1573                         if (pAttach_info == NULL) {
1574                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "calloc is failed");
1575                                 if (attach_list)
1576                                         goto FREE_LIST;
1577                                 else
1578                                         return NULL;
1579                         } else {
1580                                 if (strlen(strFileName)) {
1581                                         strncpy(pAttach_info->pfile_name, strFileName, MSG_VIEWER_FILENAME_MAX_LEN);
1582                                 } else {
1583                                         const char *file_name = NULL;
1584                                         file_name = ecore_file_file_get(strFilePath);
1585                                         if (file_name)
1586                                                 strncpy(pAttach_info->pfile_name, file_name, MSG_VIEWER_FILENAME_MAX_LEN);
1587                                         else
1588                                                 strncpy(pAttach_info->pfile_name, strFilePath, MSG_VIEWER_FILENAME_MAX_LEN);
1589                                 }
1590
1591                                 strncpy(pAttach_info->pfile_path, strFilePath, MSG_VIEWER_FILEPATH_MAX_LEN);
1592
1593                                 pAttach_info->pfile_size = ecore_file_size(strFilePath);
1594                                 pAttach_info->media_type = MSG_VIEWER_MEDIA_ATTACH;
1595                                 pAttach_info->viewer_play_data = viewer_play_data;
1596
1597                                 /*append attach list*/
1598                                 attach_list = eina_list_append(attach_list, pAttach_info);
1599                                 attach_count++;
1600                         }
1601                 }
1602         }
1603
1604         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Total %d attach(s) added", attach_count);
1605         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1606
1607         return attach_list;
1608 FREE_LIST:
1609         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Free attachment list");
1610         if (attach_list) {
1611                 int index = 0;
1612                 int ntotal = 0;
1613                 ntotal = eina_list_count(attach_list);
1614                 for (index = 0; index < ntotal; index++) {
1615                         MSG_VIEWER_ATTACH_MEDIA_INFO_S *pAttach_info = eina_list_nth(attach_list, index);
1616                         if (pAttach_info) {
1617                                 free(pAttach_info);
1618                                 pAttach_info = NULL;
1619                         }
1620                 }
1621                 eina_list_free(attach_list);
1622                 attach_list = NULL;
1623         }
1624         return NULL;
1625 }
1626
1627 void msg_ui_viewer_title_update(MSG_PLAY_DATA_S *data, MSG_VIEWER_OPTION_CHANGE_TYPE_E option_type)
1628 {
1629         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1630         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
1631         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1632
1633         int addr_count = msg_ui_viewer_get_thread_address_count(viewer_play_data);
1634         char *display_name;
1635         char *address = NULL;
1636         int contact_id = 0;
1637
1638         msg_ui_viewer_get_thread_address_nth_address(viewer_play_data, 0, &address, &contact_id);
1639
1640         if (!address) {
1641                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "address is NULL");
1642                 return;
1643         }
1644
1645         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "addr_count = %d, address = %s, contact_id = %d", addr_count, address, contact_id);
1646
1647         if (option_type == MSG_VIEWER_OPTION_CONTACT) {
1648                 display_name = msg_viewer_util_get_display_name_by_index(contact_id);
1649                 /* change title button */
1650                 if (addr_count == 1) {
1651                         if (display_name) {
1652                                 elm_object_text_set(viewer_play_data->title_button, display_name);
1653                                 free(display_name);
1654                         } else {
1655                                 elm_object_text_set(viewer_play_data->title_button, address);
1656                         }
1657                 } else if (addr_count > 1) {
1658                         char title_text[DEF_BUF_LEN+1] = {0,};
1659                         if (display_name) {
1660                                 snprintf(title_text, sizeof(title_text), "%s +%d", display_name, addr_count-1);
1661                                 free(display_name);
1662                         } else {
1663                                 snprintf(title_text, sizeof(title_text), "%s +%d", address, addr_count-1);
1664                         }
1665
1666                         elm_object_text_set(viewer_play_data->title_button, title_text);
1667                 } else {
1668                         elm_object_text_set(viewer_play_data->title_button, dgettext("sys_string", "IDS_COM_BODY_UNKNOWN"));
1669                 }
1670         }
1671
1672         free(address);
1673
1674         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1675
1676         return;
1677 }
1678
1679 void msg_ui_viewer_show_popup(void *data, Evas_Object *parent, char *pcontent)
1680 {
1681         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1682         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
1683         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, parent == NULL);
1684         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1685         Evas_Object *popup = NULL;
1686
1687         if (viewer_play_data->popup) {
1688                 evas_object_del(viewer_play_data->popup);
1689                 viewer_play_data->popup = NULL;
1690                 viewer_play_data->popup_type = MSG_VIEWER_POPUP_NONE;
1691         }
1692
1693         popup = elm_popup_add(parent);
1694         MSG_UI_RETM_IF(MSG_UI_LEVEL_ERR, popup == NULL, "popup is NULL");
1695         viewer_play_data->popup = popup;
1696         viewer_play_data->popup_type = MSG_VIEWER_NORMAL_POPUP;
1697         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1698
1699         if (pcontent) {
1700                 elm_object_text_set(popup, pcontent);
1701                 elm_popup_timeout_set(popup, 2);
1702                 evas_object_smart_callback_add(popup, "block,clicked", msg_ui_viewer_popup_block_clicked_cb, viewer_play_data);
1703                 evas_object_smart_callback_add(popup, "timeout", msg_ui_viewer_popup_timeout_cb, viewer_play_data);
1704         } else {
1705                 evas_object_del(viewer_play_data->popup);
1706                 viewer_play_data->popup = NULL;
1707                 viewer_play_data->popup_type = MSG_VIEWER_POPUP_NONE;
1708                 return;
1709         }
1710
1711         evas_object_show(popup);
1712
1713         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1714 }
1715
1716 void msg_ui_viewer_popup_block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1717 {
1718         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1719         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
1720         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1721
1722         if (viewer_play_data->popup) {
1723                 evas_object_del(viewer_play_data->popup);
1724                 viewer_play_data->popup = NULL;
1725                 viewer_play_data->popup_type = MSG_VIEWER_POPUP_NONE;
1726         }
1727
1728         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1729 }
1730
1731 void msg_ui_viewer_popup_timeout_cb(void *data, Evas_Object *obj, void *event_info)
1732 {
1733         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1734         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
1735         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1736
1737         if (viewer_play_data->popup) {
1738                 evas_object_del(viewer_play_data->popup);
1739                 viewer_play_data->popup = NULL;
1740                 viewer_play_data->popup_type = MSG_VIEWER_POPUP_NONE;
1741         }
1742
1743         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1744 }
1745
1746 MSG_SMIL_ERROR_E msg_ui_viewer_help_page_smilrenderer_cb(MSG_PLAY_DATA_S *data, void **attach_list, void *box)
1747 {
1748         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1749         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
1750         Evas_Object *renderBox = (Evas_Object *)box;
1751         MSG_SMIL_ERROR_E err = MSG_SMIL_SUCCESS;
1752         int attach_count = viewer_play_data->attach_count;
1753
1754         /* create box (for setting min size of genlist)*/
1755         Evas_Object *box2 = elm_box_add(renderBox);
1756         evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1757         evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
1758         evas_object_show(box2);
1759
1760         /* create genlist */
1761         Evas_Object *genlist = elm_genlist_add(box2);
1762         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1763         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
1764         elm_genlist_homogeneous_set(genlist, EINA_TRUE);
1765         elm_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
1766         evas_object_show(genlist);
1767
1768         elm_box_pack_end(box2, genlist);
1769         evas_object_size_hint_min_set(box2, 0, VIEWER_ATTACH_GL_ITEM_HEIGHT * (attach_count + 1) * elm_config_scale_get());
1770
1771         viewer_play_data->hp_sa_class.item_style  = "dialogue/1text.1icon";
1772         viewer_play_data->hp_sa_class.func.text_get = __msg_ui_viewer_help_page_gl_text_get;
1773         viewer_play_data->hp_sa_class.func.content_get  = __msg_ui_viewer_help_page_gl_content_get;
1774         viewer_play_data->hp_sa_class.func.state_get = NULL;
1775         viewer_play_data->hp_sa_class.func.del = __msg_ui_viewer_help_page_gl_del;
1776
1777         viewer_play_data->hp_class.item_style  = "dialogue/1text.2icon";
1778         viewer_play_data->hp_class.func.text_get = __msg_ui_viewer_help_page_gl_text_get;
1779         viewer_play_data->hp_class.func.content_get  = __msg_ui_viewer_help_page_gl_content_get;
1780         viewer_play_data->hp_class.func.state_get = NULL;
1781         viewer_play_data->hp_class.func.del = __msg_ui_viewer_help_page_gl_del;
1782
1783         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "attachment_count = %d", attach_count);
1784
1785         if (attach_count > 0) {
1786                 int attach_index = 0;
1787
1788                 if (attach_count > 1) {
1789                         //make 'Save all' item
1790                         MSG_VIEWER_ATTACH_MEDIA_INFO_S *pItem = (MSG_VIEWER_ATTACH_MEDIA_INFO_S*)calloc(1, sizeof(MSG_VIEWER_ATTACH_MEDIA_INFO_S));
1791                         memset(pItem, 0x00, sizeof(MSG_VIEWER_ATTACH_MEDIA_INFO_S));
1792                         strncpy(pItem->pfile_name, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_HEADER_SAVE_ALL"), strlen(dgettext(MESSAGE_PKGNAME, "IDS_MSGF_HEADER_SAVE_ALL")));
1793                         pItem->isSaveAll = TRUE;
1794                         pItem->viewer_play_data = viewer_play_data;
1795
1796                         for (attach_index = 0; attach_index < attach_count; attach_index++) {
1797                                 MSG_VIEWER_ATTACH_MEDIA_INFO_S *pAttach_info = eina_list_nth(viewer_play_data->attach_list, attach_index);
1798                                 if (pAttach_info == NULL) {
1799                                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "(%d)th pAttach_info is NULL", attach_index);
1800                                 } else {
1801                                         pItem->pfile_size += pAttach_info->pfile_size;
1802                                 }
1803                         }
1804
1805                         Elm_Object_Item *item = NULL;
1806                         item = elm_genlist_item_append(genlist, &(viewer_play_data->hp_sa_class), pItem, NULL, ELM_GENLIST_ITEM_NONE, __msg_ui_viewer_help_page_gl_sel, NULL);
1807                         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1808                 }
1809
1810                 for (attach_index = 0; attach_index < attach_count; attach_index++) {
1811                         MSG_VIEWER_ATTACH_MEDIA_INFO_S *pAttach_info = eina_list_nth(viewer_play_data->attach_list, attach_index);
1812                         if (pAttach_info == NULL) {
1813                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "pAttach_info is NULL");
1814                         } else {
1815                                 MSG_VIEWER_ATTACH_MEDIA_INFO_S *pItem = (MSG_VIEWER_ATTACH_MEDIA_INFO_S*)calloc(1, sizeof(MSG_VIEWER_ATTACH_MEDIA_INFO_S));
1816                                 memcpy(pItem, pAttach_info, sizeof(MSG_VIEWER_ATTACH_MEDIA_INFO_S));
1817
1818                                 elm_genlist_item_append(genlist, &(viewer_play_data->hp_class), pItem, NULL, ELM_GENLIST_ITEM_NONE, __msg_ui_viewer_help_page_gl_sel, pItem);
1819                         }
1820                 }
1821         }
1822
1823         viewer_play_data->help_page_gl = genlist;
1824
1825         elm_box_pack_end(renderBox, box2);
1826         *attach_list = genlist;
1827
1828         return err;
1829 }
1830
1831 static char *__msg_ui_viewer_help_page_gl_text_get(void *data, Evas_Object *obj, const char *part)
1832 {
1833         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, NULL);
1834         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, part == NULL, NULL);
1835         MSG_VIEWER_ATTACH_MEDIA_INFO_S *pAttach_info = (MSG_VIEWER_ATTACH_MEDIA_INFO_S *)data;
1836
1837         if (strcmp(part, "elm.text") == 0) {
1838                 if (pAttach_info) {
1839                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "pAttach_info->pfile_name = %s", pAttach_info->pfile_name);
1840
1841                         Eina_Strbuf *text_buf = eina_strbuf_new();
1842                         eina_strbuf_append(text_buf, pAttach_info->pfile_name);
1843                         eina_strbuf_append(text_buf, VIEWER_DETAILS_TEXT_SPACE);
1844                         eina_strbuf_append(text_buf, VIEWER_DETAILS_TEXT_LEFT_BRACE);
1845
1846                         //get and convert size
1847                         char size[DEF_BUF_LEN] = {0,};
1848                         long long sizeKB = 0;
1849                         long long sizeB = 0;
1850
1851                         if (pAttach_info->pfile_size < VIEWER_DETAILS_TEXT_MSG_SIZE_KB) {
1852                                 snprintf(size, sizeof(size), "1 %s", dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_MSGSIZE_KB"));
1853                         } else {
1854                                 sizeKB = (long long)(pAttach_info->pfile_size)/VIEWER_DETAILS_TEXT_MSG_SIZE_KB;
1855                                 sizeB = (long long)(pAttach_info->pfile_size)%VIEWER_DETAILS_TEXT_MSG_SIZE_KB;
1856
1857                                 if (sizeB >= (VIEWER_DETAILS_TEXT_MSG_SIZE_KB/2))
1858                                         sizeKB++;
1859
1860                                 snprintf(size, sizeof(size), "%lld %s", sizeKB, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_MSGSIZE_KB"));
1861                         }
1862
1863                         eina_strbuf_append(text_buf, size);
1864                         eina_strbuf_append(text_buf, VIEWER_DETAILS_TEXT_RIGHT_BRACE);
1865
1866                         char *return_text = strdup(eina_strbuf_string_get(text_buf));
1867                         eina_strbuf_free(text_buf);
1868
1869                         return return_text;
1870                 }
1871         }
1872
1873         return NULL;
1874 }
1875
1876 static Evas_Object *__msg_ui_viewer_help_page_gl_content_get(void *data, Evas_Object *obj, const char *part)
1877 {
1878         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, NULL);
1879         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, obj == NULL, NULL);
1880         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, part == NULL, NULL);
1881
1882         if (strcmp(part, "elm.icon.2") == 0 || strcmp(part, "elm.icon") == 0) {
1883                 Evas_Object *box = elm_box_add(obj);
1884                 Evas_Object *button = elm_button_add(obj);
1885                 Evas_Object *icon = elm_icon_add(obj);
1886
1887                 evas_object_propagate_events_set(button, EINA_FALSE);
1888                 elm_box_pack_start(box, button);
1889                 elm_image_file_set(icon, MSG_IMAGES_EDJ, MSG_VIEWER_IMAGE_SAVE_ICON);
1890                 elm_object_part_content_set(button, "icon", icon);
1891                 evas_object_smart_callback_add(button, "clicked", msg_ui_viewer_help_page_save_button_clicked_cb, data);
1892                 evas_object_show(button);
1893                 evas_object_show(box);
1894                 return box;
1895         } else if (strcmp(part, "elm.icon.1") == 0) {
1896                 MSG_VIEWER_ATTACH_MEDIA_INFO_S *pAttach_info = (MSG_VIEWER_ATTACH_MEDIA_INFO_S *)data;
1897                 Evas_Object *image = NULL;
1898
1899                 image = elm_icon_add(obj);
1900
1901                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "pAttach_info->pfile_path = %s", pAttach_info->pfile_path);
1902
1903                 /*set attach file icon*/
1904                 if (pAttach_info->media_type == MSG_VIEWER_MEDIA_IMG ||
1905                                 pAttach_info->media_type == MSG_VIEWER_MEDIA_ANIMATE) {
1906                         elm_image_file_set(image, pAttach_info->pfile_path, NULL);
1907                 } else if (pAttach_info->media_type == MSG_VIEWER_MEDIA_DRM) {
1908                         elm_image_file_set(image, MSG_IMAGES_EDJ, MSG_VIEWER_IMAGE_DRM_SMALL_ICON);
1909                 } else {
1910                         if (strlen(pAttach_info->pfile_path)) {
1911                                 const char *icon_path = NULL;
1912
1913                                 icon_path = msg_common_get_file_icon(pAttach_info->pfile_path);
1914                                 if (icon_path) {
1915                                         elm_image_file_set(image, MSG_IMAGES_EDJ, icon_path);
1916                                 } else {
1917                                         D_EMSG("icon_path is NULL");
1918                                         elm_image_file_set(image, MSG_IMAGES_EDJ, MSG_VIEWER_IMAGE_ATTACH_ICON);
1919                                 }
1920                         } else {
1921                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "filepath is NULL");
1922                                 return NULL;
1923                         }
1924                 }
1925
1926                 if (image)
1927                         evas_object_size_hint_aspect_set(image, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1928
1929                 return image;
1930         } else {
1931                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Invalid part : %s", part);
1932         }
1933
1934         return NULL;
1935 }
1936
1937 static void __msg_ui_viewer_help_page_gl_sel(void *data, Evas_Object *obj, void *event_info)
1938 {
1939         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
1940         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, event_info == NULL);
1941         MSG_VIEWER_ATTACH_MEDIA_INFO_S *pAttach_info = (MSG_VIEWER_ATTACH_MEDIA_INFO_S *)data;
1942         Elm_Object_Item *pselected_item = (Elm_Object_Item *)event_info;
1943         service_h svc_handle = NULL;
1944         service_error_e err = MSG_SUCCESS;
1945
1946         elm_genlist_item_selected_set(pselected_item, FALSE);
1947
1948         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "pfile_name = [%s]", pAttach_info->pfile_name);
1949         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "pfile_path = [%s]", pAttach_info->pfile_path);
1950         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "emedia_type = %d", pAttach_info->media_type);
1951
1952         //Save all item
1953         if (!strcmp(pAttach_info->pfile_name, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_HEADER_SAVE_ALL"))) {
1954                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Save all item");
1955                 return;
1956         }
1957
1958         if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
1959                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "service_create() is failed !!");
1960                 return;
1961         }
1962
1963         service_set_operation(svc_handle, SERVICE_OPERATION_VIEW);
1964         service_set_uri(svc_handle, pAttach_info->pfile_path);
1965
1966         err = service_send_launch_request(svc_handle, NULL, NULL);
1967         if ( err == SERVICE_ERROR_NONE) {
1968                 if (pAttach_info->viewer_play_data) {
1969                         /* set player state to pause and update icon */
1970                         if (!msg_ui_viewer_command_play_pause(pAttach_info->viewer_play_data, MSG_VIEWER_ACTION_AUTO_PAUSE)) {
1971                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_ui_viewer_command_play_pause is failed");
1972                                 return;
1973                         }
1974                 }
1975         } else {
1976                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "service_send_launch_request is failed");
1977         }
1978
1979         service_destroy(svc_handle);
1980
1981         return;
1982 }
1983
1984 static void __msg_ui_viewer_help_page_gl_del(void *data, Evas_Object *obj)
1985 {
1986         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1987
1988         MSG_VIEWER_ATTACH_MEDIA_INFO_S *del_data = (MSG_VIEWER_ATTACH_MEDIA_INFO_S *)data;
1989         if (del_data) {
1990                 free(del_data);
1991                 del_data = NULL;
1992         }
1993
1994         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
1995 }
1996
1997 void msg_ui_viewer_create_play_controller_timer(MSG_PLAY_DATA_S *data)
1998 {
1999         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
2000         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
2001         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
2002
2003         //register timer for disappear play_controller automatically when time elapsed after shown
2004         if (viewer_play_data->play_controller_timer) {
2005                 ecore_timer_del(viewer_play_data->play_controller_timer);
2006                 viewer_play_data->play_controller_timer = NULL;
2007         }
2008
2009         viewer_play_data->play_controller_timer = ecore_timer_add(VIEWER_PLAY_CONTROLLER_LIFETIME, msg_ui_viewer_play_controller_timer_cb, (void *)viewer_play_data);
2010
2011         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
2012 }
2013
2014 void msg_ui_viewer_create_progressbar(MSG_PLAY_DATA_S *data, int slideIdx)
2015 {
2016         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
2017         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
2018         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
2019         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, viewer_play_data->SmilHandle == NULL);
2020
2021         Evas_Object *progressbar = NULL;
2022         MSG_VIEWER_LAUNCH_VIEW_MODE_E launchmode = MSG_VIEWER_INVALID_MODE;
2023         MSG_BOOL bExcludeHp = FALSE;
2024         double total_time = 0.0;
2025         double remain_time = 0.0;
2026         double elapse_time = 0.0;
2027         int remain_second = 0.0;
2028         int elapse_second = 0.0;
2029         char strTimeBuf[10] = {0,};
2030
2031         if (slideIdx < 0 ) {
2032                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "slideIdx = %d, slideIdx must be same or over 0", slideIdx);
2033                 return;
2034         }
2035
2036         if (!viewer_play_data->progressbar) {
2037                 progressbar = elm_progressbar_add(viewer_play_data->play_controller);
2038                 elm_object_theme_set(progressbar, viewer_play_data->progress_th);
2039                 elm_object_style_set(progressbar, "list_progress");
2040                 elm_progressbar_horizontal_set(progressbar, EINA_TRUE);
2041                 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
2042                 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2043                 viewer_play_data->progressbar = progressbar;
2044                 evas_object_show(progressbar);
2045                 elm_object_part_content_set(viewer_play_data->play_controller,"progressbar", progressbar);
2046         }
2047
2048         msg_ui_viewer_get_viewer_launchmode(viewer_play_data->viewer_main, &launchmode);
2049
2050         //In preview mode, slide time for help page should not be considered to total slide time
2051         bExcludeHp = (launchmode == MSG_VIEWER_PREVIEW_MODE) ? TRUE : FALSE;
2052
2053         if (!msg_smil_get_slide_time(viewer_play_data->SmilHandle, 0, bExcludeHp, &total_time)) {
2054                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_get_slide_time is failed, slideIdx = %d, bExcludeHp = %d", 0, bExcludeHp);
2055                 return;
2056         }
2057         if (!msg_smil_get_slide_time(viewer_play_data->SmilHandle, slideIdx, bExcludeHp, &remain_time)) {
2058                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_smil_get_slide_time is failed, slideIdx = %d, bExcludeHp = %d", slideIdx, bExcludeHp);
2059                 return;
2060         }
2061
2062         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Total slide time is %f", total_time);
2063         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Remain slide time from current slide(%d) is %f", slideIdx, remain_time);
2064         elapse_time = total_time-remain_time;
2065         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Elapsed slide time from first slide(0) to current slide(%d) is %f", slideIdx, elapse_time);
2066
2067         viewer_play_data->totalProgressTime = remain_second = (int)total_time/1000;
2068         elapse_second = (int)elapse_time/1000;
2069         viewer_play_data->elapsedProgressTime = elapse_second;
2070
2071         // START timer text set
2072         snprintf(strTimeBuf, sizeof(strTimeBuf), "%02d:%02d", elapse_second/60, elapse_second%60);
2073         edje_object_part_text_set(_EDJ(viewer_play_data->play_controller), "progress/start/time", strTimeBuf);
2074
2075         bzero(strTimeBuf, sizeof(strTimeBuf));
2076
2077         // END timer text set
2078         snprintf(strTimeBuf, sizeof(strTimeBuf), "%02d:%02d", remain_second/60, remain_second%60);
2079         edje_object_part_text_set(_EDJ(viewer_play_data->play_controller), "progress/end/time", strTimeBuf);
2080
2081         elm_progressbar_value_set(viewer_play_data->progressbar, ((double)viewer_play_data->elapsedProgressTime)/((double)viewer_play_data->totalProgressTime));
2082
2083         if (viewer_play_data->play_controller_progressbar_timer) {
2084                 ecore_timer_del(viewer_play_data->play_controller_progressbar_timer);
2085                 viewer_play_data->play_controller_progressbar_timer = NULL;
2086         }
2087
2088         viewer_play_data->play_controller_progressbar_timer = ecore_timer_add(VIEWER_PLAY_CONTROLLER_PROGRESSBAR_TIME, msg_ui_viewer_play_controller_progressbar_timer_cb, viewer_play_data);
2089
2090         if (msg_smil_get_current_slide_status(viewer_play_data->SmilHandle) == PLAYER_STATUS_PAUSED) {
2091                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Pause progress timer because current slide status is PAUSED");
2092                 ecore_timer_freeze(viewer_play_data->play_controller_progressbar_timer);
2093         }
2094
2095         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
2096 }
2097
2098 Eina_Bool  msg_ui_viewer_play_controller_progressbar_timer_cb(void *data)
2099 {
2100         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
2101         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, data == NULL, FALSE);
2102         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
2103
2104         char strTimeBuf[10] = {0,};
2105
2106         viewer_play_data->elapsedProgressTime += VIEWER_PLAY_CONTROLLER_PROGRESSBAR_TIME;
2107
2108         // update START timer text
2109         snprintf(strTimeBuf, sizeof(strTimeBuf), "%02d:%02d", viewer_play_data->elapsedProgressTime/60, viewer_play_data->elapsedProgressTime%60);
2110         edje_object_part_text_set(_EDJ(viewer_play_data->play_controller), "progress/start/time", strTimeBuf);
2111
2112         if (viewer_play_data->elapsedProgressTime == viewer_play_data->totalProgressTime) {
2113                 if (viewer_play_data->play_controller && evas_object_visible_get(viewer_play_data->play_controller) == EINA_FALSE) {
2114                         elm_object_part_content_set(viewer_play_data->play_layout, "viewer.swallow.play.controller", viewer_play_data->play_controller);
2115                         evas_object_show(viewer_play_data->play_controller);
2116                         viewer_play_data->playcontroller_opened = true;
2117                         elm_object_signal_emit(viewer_play_data->play_layout, "elm,state,blockrect,open", "");
2118                         msg_ui_viewer_create_play_controller_timer(viewer_play_data);
2119                 } else {
2120                         // create play controller timer again
2121                         msg_ui_viewer_create_play_controller_timer(viewer_play_data);
2122                 }
2123
2124                 elm_progressbar_value_set(viewer_play_data->progressbar, 1.0);
2125                 viewer_play_data->play_controller_progressbar_timer = NULL;
2126
2127                 return ECORE_CALLBACK_CANCEL;
2128         }
2129
2130         elm_progressbar_value_set(viewer_play_data->progressbar, ((double)viewer_play_data->elapsedProgressTime)/((double)viewer_play_data->totalProgressTime));
2131
2132         return ECORE_CALLBACK_RENEW;
2133 }
2134
2135 void msg_ui_viewer_destroy_play_controller_progressbar_timer(MSG_PLAY_DATA_S *data)
2136 {
2137         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
2138         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
2139         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
2140
2141         if (viewer_play_data->play_controller_progressbar_timer) {
2142                 ecore_timer_del(viewer_play_data->play_controller_progressbar_timer);
2143                 viewer_play_data->play_controller_progressbar_timer = NULL;
2144                 viewer_play_data->elapsedProgressTime = 0;
2145         }
2146
2147         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
2148 }
2149
2150 Eina_Bool msg_ui_viewer_play_controller_timer_cb(void *data)
2151 {
2152         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
2153         MSG_UI_RETVM_IF(MSG_UI_LEVEL_ERR, data == NULL, EINA_FALSE, "data is NULL");
2154         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
2155
2156         viewer_play_data->play_controller_timer = NULL;
2157
2158         if (viewer_play_data->playcontroller_opened) {
2159                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Play controller is hided after 3 seconds elapsed");
2160                 elm_object_part_content_unset(viewer_play_data->play_layout, "viewer.swallow.play.controller");
2161                 evas_object_hide(viewer_play_data->play_controller);
2162                 viewer_play_data->playcontroller_opened = false;
2163                 if (!viewer_play_data->title_menu_opened)
2164                         elm_object_signal_emit(viewer_play_data->play_layout, "elm,state,blockrect,close", "");
2165         }
2166
2167         return ECORE_CALLBACK_CANCEL;
2168 }
2169
2170 void msg_ui_viewer_destroy_play_controller_timer(MSG_PLAY_DATA_S *data)
2171 {
2172         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
2173         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
2174         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
2175
2176         if (viewer_play_data->play_controller_timer) {
2177                 ecore_timer_del(viewer_play_data->play_controller_timer);
2178                 viewer_play_data->play_controller_timer = NULL;
2179         }
2180
2181         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
2182 }
2183
2184 void msg_ui_viewer_copy_message_text_to_clipboard(MSG_PLAY_DATA_S *data)
2185 {
2186         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
2187         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
2188         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
2189         SMIL_SLIDE_CLIENT_CB_PARAM_S *eventStatus = NULL;
2190
2191         int page_count = 0;
2192         int media_count = 0;
2193         bool is_text_copied = FALSE;
2194         int media_idx = 0;
2195         char strFilePath[MSG_FILEPATH_LEN_MAX] = {0,};
2196         FILE *fp = NULL;
2197
2198         eventStatus = (SMIL_SLIDE_CLIENT_CB_PARAM_S * )viewer_play_data->smil_eventStatus;
2199         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Current page index is %d", eventStatus->pageIdx);
2200
2201         /*get page list info*/
2202         msg_list_handle_t pagelist_info = NULL;
2203         msg_get_list_handle(viewer_play_data->mms_t, MSG_MMS_PAGE_LIST_HND, (void **)&pagelist_info);
2204         page_count = msg_list_length(pagelist_info);
2205
2206         msg_struct_t page_info = NULL;
2207         page_info = (msg_struct_t)msg_list_nth_data(pagelist_info, eventStatus->pageIdx);
2208         if (!page_info) {
2209                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "page_info is NULL");
2210                 return;
2211         }
2212
2213         msg_list_handle_t medialist_info = NULL;
2214         msg_get_list_handle(page_info, MSG_MMS_PAGE_MEDIA_LIST_HND, (void **)&medialist_info);
2215         media_count = msg_list_length(medialist_info);
2216         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "page = %d, page media count = %d", eventStatus->pageIdx, media_count);
2217
2218         for (media_idx = 0; media_idx < media_count; media_idx++) {
2219                 int mediaType;
2220                 msg_struct_t media_info = NULL;
2221                 media_info = (msg_struct_t)msg_list_nth_data(medialist_info, media_idx);
2222
2223                 if (!media_info) {
2224                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "%d media_info is NULL", media_idx);
2225                         continue;
2226                 }
2227
2228                 msg_get_int_value(media_info, MSG_MMS_MEDIA_TYPE_INT, &mediaType);
2229
2230                 if (mediaType != MMS_SMIL_MEDIA_TEXT) {
2231                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "%d media type is not TEXT", media_idx);
2232                         continue;
2233                 }
2234
2235                 bzero(strFilePath, sizeof(strFilePath));
2236                 msg_get_str_value(media_info, MSG_MMS_MEDIA_FILEPATH_STR, strFilePath, sizeof(strFilePath));
2237
2238                 //if text media is exist, get text and store it
2239                 fp = fopen(strFilePath, "r");
2240                 if (fp) {
2241                         char *pszPageText = NULL;
2242                         struct stat stat_buf;
2243                         if (stat(strFilePath, &stat_buf) != 0) {
2244                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Getting file information Error");
2245                                 fclose(fp);
2246                                 return;
2247                         }
2248
2249                         if (stat_buf.st_size > 0) {
2250                                 pszPageText = (void *)calloc(1, (size_t)stat_buf.st_size + 1);
2251
2252                                 if (pszPageText == NULL) {
2253                                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "calloc is failed");
2254                                         fclose(fp);
2255                                         return;
2256                                 } else {
2257                                         int result = fread(pszPageText, sizeof(char), stat_buf.st_size, fp);
2258                                         if (result != stat_buf.st_size) {
2259                                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "fread is failed result : %d", result);
2260                                         }
2261                                 }
2262                                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "pszPageText : (%s)", (char *)pszPageText);
2263
2264                                 if (pszPageText[0] != '\0') {
2265                                         Evas_Object *entry = elm_entry_add(viewer_play_data->main_window);
2266                                         elm_cnp_selection_set(entry, ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT, pszPageText, strlen(pszPageText));
2267                                         evas_object_del(entry);
2268                                         is_text_copied = TRUE;
2269                                 }
2270
2271                                 /*free message text after displaying*/
2272                                 if (pszPageText) {
2273                                         free(pszPageText);
2274                                         pszPageText = NULL;
2275                                 }
2276
2277                                 fclose(fp);
2278                                 break;
2279                         }
2280
2281                         fclose(fp);
2282                 }
2283         }
2284
2285         if (is_text_copied)
2286                 status_message_post(dgettext(MESSAGE_PKGNAME, "IDS_MSGF_POP_COPIED_TO_CLIPBOARD"));
2287
2288         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
2289 }
2290
2291 void msg_ui_viewer_create_msg_detail_popup(MSG_PLAY_DATA_S *data)
2292 {
2293         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
2294         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, data == NULL);
2295         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
2296         Evas_Object *popup = NULL;
2297         Evas_Object *layout = NULL;
2298         Evas_Object *bg = NULL;
2299         Evas_Object *scroller = NULL;
2300         Evas_Object *box = NULL;
2301         Evas_Object *entry = NULL;
2302         Evas_Object *btn_close = NULL;
2303
2304         /* delete previous popup */
2305         if (viewer_play_data->popup) {
2306                 evas_object_del(viewer_play_data->popup);
2307                 viewer_play_data->popup = NULL;
2308                 viewer_play_data->popup_type = MSG_VIEWER_POPUP_NONE;
2309         }
2310
2311         /* create popup */
2312         popup = elm_popup_add(viewer_play_data->main_window);
2313         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2314         evas_object_size_hint_align_set(popup, EVAS_HINT_FILL, EVAS_HINT_FILL);
2315         elm_object_style_set(popup, "menustyle");
2316         elm_object_part_text_set(popup, "title,text", dgettext(MESSAGE_PKGNAME, "IDS_MSGF_HEADER_MESSAGE_DETAILS"));
2317
2318         /* create layout */
2319         layout = elm_layout_add(viewer_play_data->main_window);
2320         elm_layout_file_set(layout, MSG_VIEWER_THEME, "msg/detail");
2321         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2322         evas_object_show(layout);
2323
2324         /* create bg */
2325         bg = evas_object_rectangle_add(evas_object_evas_get(layout));
2326         elm_object_part_content_set(layout,  "msg/detail/bg", bg);
2327         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, 0.0);
2328         evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, 0.0);
2329         evas_object_show(bg);
2330
2331         /* create scroller */
2332         scroller = elm_scroller_add(layout);
2333         evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2334         evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
2335         elm_scroller_bounce_set(scroller, FALSE, TRUE);
2336         elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
2337         elm_object_part_content_set(layout, "msg/detail/content", scroller);
2338         evas_object_show(scroller);
2339
2340         /* create box */
2341         box = elm_box_add(layout);
2342         evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2343         evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
2344         elm_box_homogeneous_set(box, EINA_FALSE);
2345         evas_object_show(box);
2346         evas_object_size_hint_min_set(box, 0, VIEWER_ATTACH_GL_ITEM_HEIGHT*4);
2347         elm_object_content_set(scroller, box);
2348
2349         /*create entry */
2350         entry = elm_entry_add(layout);
2351         evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2352         evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
2353         elm_entry_single_line_set(entry, EINA_FALSE);
2354         elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
2355         elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
2356         elm_entry_magnifier_disabled_set(entry, EINA_TRUE);
2357         elm_entry_editable_set(entry, EINA_FALSE);
2358
2359         char *str = msg_common_make_message_detail_text(viewer_play_data->msgHandle, viewer_play_data->msgID);
2360
2361         if (str) {
2362                 elm_entry_entry_set(entry, str);
2363                 free(str);
2364         } else {
2365                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_common_make_message_detail_text is failed");
2366                 return;
2367         }
2368
2369         elm_box_pack_end(box, entry);
2370         evas_object_show(entry);
2371
2372         /* add close button */
2373         btn_close = elm_button_add(popup);
2374         elm_object_style_set(btn_close, "popup_button/default");
2375         elm_object_text_set(btn_close, dgettext("sys_string", "IDS_COM_BODY_CLOSE"));
2376         elm_object_part_content_set(popup, "button1", btn_close);
2377         evas_object_smart_callback_add(btn_close, "clicked", __msg_ui_viewer_message_details_popup_close_clicked_cb, viewer_play_data);
2378
2379         viewer_play_data->popup = popup;
2380         viewer_play_data->popup_type = MSG_VIEWER_DETAILS_POPUP;
2381         elm_object_content_set(popup, layout);
2382
2383         msg_ui_viewer_disconnect_handler(viewer_play_data);
2384
2385         evas_object_show(popup);
2386
2387         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
2388 }
2389
2390 static void __msg_ui_viewer_message_details_popup_close_clicked_cb(void *data, Evas_Object *obj, void *event_info)
2391 {
2392         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
2393         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
2394
2395         if (viewer_play_data->popup) {
2396                 evas_object_del(viewer_play_data->popup);
2397                 viewer_play_data->popup = NULL;
2398                 viewer_play_data->popup_type = MSG_VIEWER_POPUP_NONE;
2399         }
2400
2401         /* connect handler again*/
2402         msg_ui_viewer_connect_handler(viewer_play_data);
2403
2404         /* play viewer again if previous status was PLAY */
2405         if (viewer_play_data->auto_resume_state && viewer_play_data->status == MSG_VIEWER_PAUSE && viewer_play_data->previous_status == MSG_VIEWER_PLAY) {
2406                 if (!msg_ui_viewer_command_play_pause(viewer_play_data, MSG_VIEWER_ACTION_AUTO_PLAY)) {
2407                         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_ui_viewer_command_play_pause is failed");
2408                         return;
2409                 }
2410         }
2411 }
2412
2413 MSG_BOOL msg_ui_viewer_check_address_is_blocked(void *data, char *address, int *filter_id)
2414 {
2415         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
2416         MSG_PLAY_DATA_S *viewer_play_data = (MSG_PLAY_DATA_S *)data;
2417         msg_error_t err = MSG_SUCCESS;
2418         msg_struct_list_s filter_list;
2419         int i = 0;
2420         int total_cnt = 0;
2421         char filter_val[MAX_FILTER_VALUE_LEN] = {0,};
2422
2423         err = msg_get_filter_list(viewer_play_data->msgHandle, &filter_list);
2424         if (err != MSG_SUCCESS) {
2425                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "msg_get_filter_list() fail - err [%d]", err);
2426                 return FALSE;
2427         }
2428
2429         total_cnt = filter_list.nCount;
2430
2431         for (i = 0; i < total_cnt; i++) {
2432                 /* get number */
2433                 bzero(filter_val, sizeof(filter_val));
2434                 err = msg_get_str_value(filter_list.msg_struct_info[i], MSG_FILTER_VALUE_STR, filter_val, sizeof(filter_val));
2435
2436                 if (err != MSG_SUCCESS) {
2437                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "msg_get_str_value() fail - err [%d]", err);
2438                         msg_release_list_struct(&filter_list);
2439                         return FALSE;
2440                 }
2441
2442                 if (!strcmp(address, filter_val)) {
2443                         int filter_type;
2444                         msg_get_int_value(filter_list.msg_struct_info[i], MSG_FILTER_TYPE_INT, &filter_type);
2445                         if (filter_type == MSG_FILTER_BY_ADDRESS_SAME) {
2446                                 /* get filter id if address is exist in block list */
2447                                 msg_get_int_value(filter_list.msg_struct_info[i], MSG_FILTER_ID_INT, filter_id);
2448                                 msg_release_list_struct(&filter_list);
2449                                 return TRUE;
2450                         }
2451                 }
2452         }
2453
2454         msg_release_list_struct(&filter_list);
2455         return FALSE;
2456 }
2457