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