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