2.0_alpha
[apps/core/preloaded/video-player.git] / src / mp-video-display-view.c
1 /*
2  * To apply the Flora License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
3  * 
4  *    Copyright [2012] [JongDong Lee <jongdong.lee@samsung.com>, ChangSun Lee <cs78.lee@samsung.com>]
5  * 
6  *    Licensed under the Flora License, Version 1.0 (the "License");
7  *    you may not use this file except in compliance with the License.
8  *    You may obtain a copy of the License at
9  * 
10  *        http://www.tizenopensource.org/license
11  * 
12  *    Unless required by applicable law or agreed to in writing, software
13  *    distributed under the License is distributed on an "AS IS" BASIS,
14  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *    See the License for the specific language governing permissions and
16  *    limitations under the License.
17  */
18
19 #include <aul.h>
20 #include <ctype.h>
21 #include <fcntl.h>
22 #include <unistd.h>
23 #include <sys/stat.h>
24 #include <syspopup_caller.h>
25
26 #include "mp-util.h"
27 #include "mp-drm-ctrl.h"
28 #include "mp-video-log.h"
29 #include "video-player.h"
30 #include "mp-video-display-view.h"
31 #include "mp-video-progressbar.h"
32 #include "mp-video-type-define.h"
33 #include "mp-video-value-define.h"
34 #include "mp-util-media-service.h"
35 #include "mp-video-string-define.h"
36 #include "mp-video-sound-path-ctrl.h"
37 #include "mp-external-ug.h"
38 #include "mp-video-service-ctrl.h"
39
40 #define CTRL_PANEL_SHOW_TIME                                    5.0
41 #define MAX_SPEED_STEP                                                  4
42
43 static Evas_Object *pNaviFrameHandle = NULL;
44 static Evas_Object *pDisplayViewLayout = NULL;
45 static Evas_Object *pDisplayViewPanelEdj = NULL;
46 static Evas_Object *pDisplayViewCtrlEdj = NULL;
47 static Evas_Object *pDisplayViewProgressbarEdj = NULL;
48 static Evas_Object *pDisplaySoundpathButton = NULL;
49
50 static Ecore_Timer *pCtrlPanelHideTimer = NULL;
51 static Ecore_Timer *pSpeedPressTimer = NULL;
52
53 static Elm_Object_Item *pNaviFrameItemForDisplayerView = NULL;
54
55 static ChangeDisplayViewCbFunc pChangeViewUserCbFunc = NULL;
56
57 static bool bIsVideoViewScreenLock = FALSE;
58 static bool bSwitchDisplayViewUI = TRUE;
59 static bool bIsSpeedLongPress = FALSE;
60 static bool bIsDisplayViewOnlyAudio = FALSE;
61 static int nSpeedMode = 0;      /*  (-1:REW, 1: FF) */
62 static int nControlMouseDownPos = 0;
63 static int nControlMouseMovePos = 0;
64
65 static int nScreensizeStatus = MP_DISPLAY_METHOD_LETTER_BOX;
66
67 static bool bIsPauseByUser = FALSE;
68
69 /*
70  * When the video display view is hieded by others view(favorite/info/etc),
71  * passing click event of mouse up in video display view.
72  */
73 static VideoDisplayViewState nDisplayViewState = MP_DISPLAY_VIEW_STATE_UNACTIVATE;
74
75
76
77 /*
78  * Internal function.
79  */
80 static void MpVideoDisplayViewUpdateFFStep(int nStep)
81 {
82         VideoLogInfo("");
83
84         if (nStep < 0 || nStep > MAX_SPEED_STEP) {
85                 VideoLogInfo("Invalid Step value:%d", nStep);
86                 return;
87         }
88
89         char sig_format[SIGNAL_TEXT_MAX_LEN] = { 0, };
90
91         switch(nStep)
92         {
93         case MP_PLAYING_SPEED_2X:       nStep = 1;      break;
94         case MP_PLAYING_SPEED_3X:       nStep = 2;      break;
95         case MP_PLAYING_SPEED_4X:       nStep = 3;      break;
96         case MP_PLAYING_SPEED_5X:       nStep = 4;      break;
97         }
98
99         if(MpUtilGetRotationState() == VIDEO_ROTATE_PORTRAIT_NORMAL || MpUtilGetRotationState() == VIDEO_ROTATE_PORTRAIT_REVERSE)
100         {
101                 snprintf(sig_format, SIGNAL_TEXT_MAX_LEN, "%s.%d", SIGNAL_CONTROL_NORMAL_FF_STEP, nStep);
102         }
103         else
104         {
105                 snprintf(sig_format, SIGNAL_TEXT_MAX_LEN, "%s.%d", SIGNAL_CONTROL_NORMAL_FF_LANDSCAPE_STEP, nStep);
106         }
107
108         VideoLogInfo("%s", sig_format);
109         edje_object_signal_emit(pDisplayViewCtrlEdj, sig_format, "*");
110 }
111
112 static void MpVideoDisplayViewUpdateREWStep(int nStep)
113 {
114         VideoLogInfo("");
115
116         if (nStep < 0 || nStep > MAX_SPEED_STEP) {
117                 VideoLogInfo("Invalid Step value:%d", nStep);
118                 return;
119         }
120
121         char sig_format[SIGNAL_TEXT_MAX_LEN] = { 0, };
122
123         switch(nStep)
124         {
125         case MP_PLAYING_SPEED_2X:       nStep = 1;      break;
126         case MP_PLAYING_SPEED_3X:       nStep = 2;      break;
127         case MP_PLAYING_SPEED_4X:       nStep = 3;      break;
128         case MP_PLAYING_SPEED_5X:       nStep = 4;      break;
129         }
130
131         if(MpUtilGetRotationState() == VIDEO_ROTATE_PORTRAIT_NORMAL || MpUtilGetRotationState() == VIDEO_ROTATE_PORTRAIT_REVERSE)
132         {
133                 snprintf(sig_format, SIGNAL_TEXT_MAX_LEN, "%s.%d", SIGNAL_CONTROL_NORMAL_REW_STEP, nStep);
134         }
135         else
136         {
137                 snprintf(sig_format, SIGNAL_TEXT_MAX_LEN, "%s.%d", SIGNAL_CONTROL_NORMAL_REW_LANDSCAPE_STEP, nStep);
138         }
139
140         VideoLogInfo("%s", sig_format);
141         edje_object_signal_emit(pDisplayViewCtrlEdj, sig_format, "*");
142 }
143
144 /*
145  * Callback function.
146  */
147
148 static void MpVideoDisplayViewWarningPopupCb(void *pUserData, Evas_Object *pObject, void *pEventInfo)
149 {
150         if (!pUserData) {
151                 VideoLogInfo("No exist pUserData");
152                 return;
153         }
154
155         VideoLogInfo("");
156
157         MpUtilDeletePopupHandle();
158 }
159
160 static void MpVideoDisplayViewSoundPathCb(void *pUserData, Evas_Object *pObject, void *pEventInfo)
161 {
162         if (!pUserData) {
163                 VideoLogInfo("[ERR] No exist pUserData");
164                 return;
165         }
166
167         VideoLogInfo("");
168
169         VideoAppData *pAppData = (VideoAppData *)pUserData;
170
171         if (MpVideoSoundpathIsConnectOtherSoundpath()) {
172                 VideoLogInfo("Connect BT or earjack.");
173                 MpVideoSoundpathShow(pUserData);
174         } else {
175                 MpUtilNotifyPopUp(pAppData, "Soundpath is connected with speaker only.", MpVideoDisplayViewWarningPopupCb);
176         }
177 }
178
179 static void MpVideoDisplayViewPressPauseButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource)
180 {
181         VideoLogInfo("");
182
183         if (!pUserData) {
184                 VideoLogInfo("[ERR]");
185                 return;
186         }
187
188         VideoAppData *pAppData = (VideoAppData *)pUserData;
189
190         if (!strcmp(szEmission, SIGNAL_CONTROL_PLAY_PAUSE_PRESS)) {
191                 VideoLogInfo("Press Pause button.");
192
193                 if (pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME ||
194                     pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY) {
195                         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData);
196                         bIsPauseByUser = TRUE;
197                 }
198         }
199 }
200
201 static void MpVideoDisplayViewPressResumeButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource)
202 {
203         VideoLogInfo("");
204
205         if (!pUserData) {
206                 VideoLogInfo("[ERR]");
207                 return;
208         }
209
210         VideoAppData *pAppData = (VideoAppData *)pUserData;
211
212         if (!strcmp(szEmission, SIGNAL_CONTROL_PLAY_RESUME_PRESS)) {
213                 VideoLogInfo("Press Resume/Play button.");
214
215                 if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PAUSE) {
216                         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
217                         bIsPauseByUser = FALSE;
218                 }
219         }
220 }
221
222 static Eina_Bool MpVideoDisplayViewSpeedLongPressCb(void *pUserData)
223 {
224         VideoLogInfo("");
225
226         if (!pUserData) {
227                 VideoLogInfo("[ERR]");
228                 return EINA_FALSE;
229         }
230
231         VideoAppData *pAppData = (VideoAppData *)pUserData;
232
233         if (pSpeedPressTimer) {
234                 ecore_timer_del(pSpeedPressTimer);
235                 pSpeedPressTimer = NULL;
236         }
237
238         bIsSpeedLongPress = TRUE;
239         pAppData->nPlayingSpeed = MP_PLAYING_SPEED_2X;
240
241         char caption[CAPTION_TEXT_MAX_LEN] = { 0, };
242
243         if(nSpeedMode == 1)
244         {
245                 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSpeedFF(pAppData);
246                 snprintf(caption, CAPTION_TEXT_MAX_LEN, "X%d fast forward", pAppData->nPlayingSpeed);
247                 MpVideoDisplayViewUpdateFFStep(pAppData->nPlayingSpeed);
248         }
249         else if(nSpeedMode == -1)
250         {
251                 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSpeedRew(pAppData);
252                 snprintf(caption, CAPTION_TEXT_MAX_LEN, "X%d fast reverse", pAppData->nPlayingSpeed);
253                 MpVideoDisplayViewUpdateREWStep(pAppData->nPlayingSpeed);
254         }
255
256         edje_object_part_text_set(_EDJ(pDisplayViewLayout), MAIN_SPEED_TEXT, caption);
257         edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_SPEEDBOX_SHOW, "*");
258
259         return EINA_FALSE;
260 }
261
262
263 static void MpVideoDisplayViewFFDownButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource)
264 {
265         VideoLogInfo("");
266
267         if (!pUserData) {
268                 VideoLogInfo("[ERR]");
269                 return;
270         }
271
272         VideoAppData *pAppData = (VideoAppData *)pUserData;
273
274         if (!strcmp(szEmission, SIGNAL_CONTROL_NORMAL_FF_BUTTON_DOWN)) {
275                 VideoLogInfo("Press FF down button.");
276                 if (pCtrlPanelHideTimer) {
277                         ecore_timer_del(pCtrlPanelHideTimer);
278                         pCtrlPanelHideTimer = NULL;
279                 }
280
281                 if (pSpeedPressTimer) {
282                         ecore_timer_del(pSpeedPressTimer);
283                         pSpeedPressTimer = NULL;
284                 }
285
286                 nSpeedMode = 1;
287                 pSpeedPressTimer = ecore_timer_add(LONG_PRESS_INTERVAL, MpVideoDisplayViewSpeedLongPressCb, (void *)pAppData);
288         }
289 }
290
291 static void MpVideoDisplayViewFFUpButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource)
292 {
293         VideoLogInfo("");
294
295         if (!pUserData) {
296                 VideoLogInfo("[ERR]");
297                 return;
298         }
299
300         VideoAppData *pAppData = (VideoAppData *)pUserData;
301
302         if (!strcmp(szEmission, SIGNAL_CONTROL_NORMAL_FF_BUTTON_UP)) {
303                 VideoLogInfo("Press FF up button.");
304                 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlShowLayout(pAppData);
305
306                 if (pSpeedPressTimer) {
307                         ecore_timer_del(pSpeedPressTimer);
308                         pSpeedPressTimer = NULL;
309                         bIsPauseByUser = FALSE;
310                         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPlayNextMedia(pAppData);
311                 } else {
312                         MpVideoDisplayViewUpdateFFStep(0);
313
314                         edje_object_part_text_set(_EDJ(pDisplayViewLayout), MAIN_SPEED_TEXT, "");
315                         edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_SPEEDBOX_HIDE, "*");
316
317                         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSpeedReset(pAppData);
318                 }
319                 bIsSpeedLongPress = FALSE;
320         }
321 }
322
323 static void MpVideoDisplayViewRewDownButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource)
324 {
325         VideoLogInfo("");
326
327         if (!pUserData) {
328                 VideoLogInfo("[ERR]");
329                 return;
330         }
331
332         VideoAppData *pAppData = (VideoAppData *)pUserData;
333
334         if (!strcmp(szEmission, SIGNAL_CONTROL_NORMAL_REW_BUTTON_DOWN)) {
335                 VideoLogInfo("Press Rewind donw button.");
336
337                 if (pCtrlPanelHideTimer) {
338                         ecore_timer_del(pCtrlPanelHideTimer);
339                         pCtrlPanelHideTimer = NULL;
340                 }
341
342                 if (pSpeedPressTimer) {
343                         ecore_timer_del(pSpeedPressTimer);
344                         pSpeedPressTimer = NULL;
345                 }
346
347                 nSpeedMode = -1;
348                 pSpeedPressTimer = ecore_timer_add(LONG_PRESS_INTERVAL, MpVideoDisplayViewSpeedLongPressCb, (void *)pAppData);
349         }
350 }
351
352 static void MpVideoDisplayViewRewUpButtonCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource)
353 {
354         VideoLogInfo("");
355
356         if (!pUserData) {
357                 VideoLogInfo("[ERR]");
358                 return;
359         }
360
361         VideoAppData *pAppData = (VideoAppData *)pUserData;
362
363         if (!strcmp(szEmission, SIGNAL_CONTROL_NORMAL_REW_BUTTON_UP)) {
364                 VideoLogInfo("Press Rewind up button.");
365                 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlShowLayout(pAppData);
366
367                 if (pSpeedPressTimer) {
368                         ecore_timer_del(pSpeedPressTimer);
369                         pSpeedPressTimer = NULL;
370                         bIsPauseByUser = FALSE;
371                         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPlayPreMedia(pAppData);
372                 } else {
373                         MpVideoDisplayViewUpdateREWStep(0);
374
375                         edje_object_part_text_set(_EDJ(pDisplayViewLayout), MAIN_SPEED_TEXT, "");
376                         edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_SPEEDBOX_HIDE, "*");
377
378                         pAppData->VideoAppCtrlCallbackFunc. VideoAppCtrlSpeedReset(pAppData);
379                 }
380                 bIsSpeedLongPress = FALSE;
381         }
382 }
383
384
385 static void MpVideoDisplayViewBackButtonDownCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource)
386 {
387         VideoLogInfo("");
388
389         if (!pUserData) {
390                 VideoLogInfo("[ERR]");
391                 return;
392         }
393
394         edje_object_signal_callback_del(pDisplayViewCtrlEdj, SIGNAL_CONTROL_BACK_BUTTON_DOWN, SIGNAL_CONTROL_PART_BACK_BUTTON, (void *)MpVideoDisplayViewBackButtonDownCb);
395
396         VideoAppData *pAppData = (VideoAppData *)pUserData;
397
398         if(pAppData->nCurPosition >= 0)
399         {
400                 MpUtilMediaSvcSetVideoLastPlayedTimeByUri(pAppData->szMediaUri, pAppData->nCurPosition);
401         }
402
403         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStopByAppPause(pAppData);
404
405         MpVideoDisplayViewPop(pNaviFrameHandle, pUserData);
406
407         edje_object_signal_callback_add(pDisplayViewCtrlEdj, SIGNAL_CONTROL_BACK_BUTTON_DOWN, SIGNAL_CONTROL_PART_BACK_BUTTON, (void *)MpVideoDisplayViewBackButtonDownCb, (void *)pAppData);
408 }
409
410
411 static void MpVideoDisplayViewVolumeButtonDownCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource)
412 {
413         VideoLogInfo("");
414 }
415
416 static void MpVideoDisplayViewVolumeButtonUpCb(void *pUserData, Evas_Object *pObject, const char *szEmission, const char *szSource)
417 {
418         VideoLogInfo("");
419
420         syspopup_launch("volume", NULL);
421 }
422
423 static Eina_Bool MpVideoDisplayViewCtrlPanelHideCb(void *pUserData)
424 {
425         VideoLogInfo("");
426
427         if (!pUserData) {
428                 VideoLogInfo("[ERR] No Exist pUserData.");
429                 return EINA_FALSE;
430         }
431
432         VideoAppData *pAppData = (VideoAppData *)pUserData;
433
434         if (pCtrlPanelHideTimer) {
435                 ecore_timer_del(pCtrlPanelHideTimer);
436                 pCtrlPanelHideTimer = NULL;
437         }
438
439         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlHideLayout(pAppData);
440
441         return EINA_FALSE;
442 }
443
444
445 static void MpVideoDisplayViewSpeedChange(void *pUserData)
446 {
447         if (!pUserData) {
448                 VideoLogInfo("[ERR] No Exist pUserData.");
449                 return;
450         }
451
452         VideoAppData *pAppData = (VideoAppData *)pUserData;
453
454         int booster_step = 0;
455
456         if (nSpeedMode == 1) {
457                 booster_step = nControlMouseMovePos - nControlMouseDownPos;
458                 booster_step = booster_step / BOOSTER_STEP_DISTANCE;
459         } else if (nSpeedMode == -1) {
460                 booster_step = nControlMouseDownPos - nControlMouseMovePos;
461                 booster_step = booster_step / BOOSTER_STEP_DISTANCE;
462         } else {
463                 VideoLogInfo("[ERR] Invalid SpeedMode.");
464                 return;
465         }
466
467         if(booster_step == 0)
468         {
469                 pAppData->nPlayingSpeed = MP_PLAYING_SPEED_2X;
470         }
471         else if(booster_step == 1)
472         {
473                 pAppData->nPlayingSpeed = MP_PLAYING_SPEED_3X;
474         }
475         else if(booster_step == 2)
476         {
477                 pAppData->nPlayingSpeed = MP_PLAYING_SPEED_4X;
478         }
479         else if(booster_step > 3)
480         {
481                 pAppData->nPlayingSpeed = MP_PLAYING_SPEED_4X;
482         }
483
484         VideoLogInfo("STEP:(%d, %d)", booster_step, pAppData->nPlayingSpeed);
485
486         char caption[CAPTION_TEXT_MAX_LEN] = { 0, };
487
488         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData);
489
490         if(nSpeedMode == 1)
491         {
492                 snprintf(caption, CAPTION_TEXT_MAX_LEN, "X%d fast forward", pAppData->nPlayingSpeed);
493                 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSpeedFF(pAppData);
494                 MpVideoDisplayViewUpdateFFStep(pAppData->nPlayingSpeed);
495         }
496         else
497         {
498                 snprintf(caption, CAPTION_TEXT_MAX_LEN, "X%d fast reverse", pAppData->nPlayingSpeed);
499                 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSpeedRew(pAppData);
500                 MpVideoDisplayViewUpdateREWStep(pAppData->nPlayingSpeed);
501         }
502
503         edje_object_part_text_set(_EDJ(pDisplayViewLayout), MAIN_SPEED_TEXT, caption);
504
505         return;
506 }
507
508 static void MpVideoDisplayViewControlMouseMoveCb(void *pUserData, Evas * e, Evas_Object *obj, void *event)
509 {
510         if (!event) {
511                 VideoLogInfo("[ERR]");
512                 return;
513         }
514
515         if (!pUserData) {
516                 VideoLogInfo("[ERR] No Exist pUserData.");
517                 return;
518         }
519
520         Evas_Event_Mouse_Move *pBtnEvent = (Evas_Event_Mouse_Move *) event;
521
522         if (bIsSpeedLongPress) {
523                 nControlMouseMovePos = pBtnEvent->cur.output.x;
524                 MpVideoDisplayViewSpeedChange(pUserData);
525         }
526 }
527
528 static void MpVideoDisplayViewControlMouseDownCb(void *pUserData, Evas * e, Evas_Object *obj, void *event)
529 {
530         VideoLogInfo("");
531
532         if (!event) {
533                 VideoLogInfo("[ERR]");
534                 return;
535         }
536
537         Evas_Event_Mouse_Down *pBtnEvent = (Evas_Event_Mouse_Down *) event;
538
539         nControlMouseDownPos = pBtnEvent->output.x;
540 }
541
542 static void MpVideoDisplayViewChangedEarjackCb(void *pNode, void *pUserData)
543 {
544         if (!pUserData) {
545                 VideoLogInfo("[ERR]");
546                 return;
547         }
548
549         VideoLogInfo("");
550
551         MpVideoSoundpathHide();
552         MpUtilDeletePopupHandle();
553
554         if (MpUtilIsConnectEarjack()) {
555                 VideoLogInfo("Connect earjack.");
556                 if (pDisplaySoundpathButton) {
557                         elm_object_item_part_content_set(pNaviFrameItemForDisplayerView, "title_right_btn", pDisplaySoundpathButton);
558                 } else {
559                         pDisplaySoundpathButton = MpUtilCreateButtonIcon(pNaviFrameHandle, VIDEO_HEAD_ICON_SOUNDPATH, FALSE, FALSE, 1, 1, pUserData, "video/naviframe/title/default", (void*)MpVideoDisplayViewSoundPathCb);
560                         elm_object_item_part_content_set(pNaviFrameItemForDisplayerView, "title_right_btn", pDisplaySoundpathButton);
561                 }
562         } else {
563                 VideoLogInfo("Disconnect earjack.");
564
565                 if (pDisplaySoundpathButton) {
566                         evas_object_del(pDisplaySoundpathButton);
567                         pDisplaySoundpathButton = NULL;
568                 }
569
570                 elm_object_item_part_content_unset(pNaviFrameItemForDisplayerView, "title_right_btn");
571         }
572 }
573
574 void MpVideoDisplayViewInitLayout(void *pUserData, int nPlayerType)
575 {
576         VideoLogInfo("");
577
578         if (!pUserData) {
579                 VideoLogInfo("[ERR]");
580                 return;
581         }
582
583         VideoAppData *pAppData = (VideoAppData *)pUserData;
584
585         pDisplayViewLayout = elm_layout_add(pNaviFrameHandle);
586         if (pDisplayViewLayout) {
587                 Evas *pMainWindowEvas = evas_object_evas_get(pAppData->pMainWindow);
588
589                 elm_layout_file_set(pDisplayViewLayout, VIDEO_PLAYER_MAIN_EDJ, MAIN_EDJ_GROUP);
590
591                 pDisplayViewCtrlEdj = MpUtilLoadEdjFile(pMainWindowEvas, VIDEO_PLAYER_CONTROL_EDJ, CONTROL_EDJ_GROUP);
592
593                 evas_object_event_callback_add(pDisplayViewCtrlEdj, EVAS_CALLBACK_MOUSE_DOWN, (void *)MpVideoDisplayViewControlMouseDownCb, pAppData);
594                 evas_object_event_callback_add(pDisplayViewCtrlEdj, EVAS_CALLBACK_MOUSE_MOVE, (void *)MpVideoDisplayViewControlMouseMoveCb, pAppData);
595
596                 pDisplayViewPanelEdj = MpUtilLoadEdjFile(pMainWindowEvas, VIDEO_PLAYER_PANEL_EDJ, PANEL_EDJ_GROUP);
597
598                 edje_object_part_swallow(pDisplayViewPanelEdj, SWALLOW_PANEL_CONTROL, pDisplayViewCtrlEdj);
599
600                 pDisplayViewProgressbarEdj = (Evas_Object *)MpVideoProgressbarInit(pAppData);
601                 if (pDisplayViewProgressbarEdj) {
602                         edje_object_part_swallow(pDisplayViewPanelEdj, SWALLOW_PANEL_PROGRESS_BAR, pDisplayViewProgressbarEdj);
603                 } else {
604                         VideoLogInfo("Progressbar edj handle is null.");
605                 }
606
607                 elm_object_part_content_set(pDisplayViewLayout, SWALLOW_MAIN_CONTROL, pDisplayViewPanelEdj);
608
609                 edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_MODE_NORMAL, "*");
610
611
612                 edje_object_signal_callback_add(pDisplayViewCtrlEdj,
613                                                 SIGNAL_CONTROL_PLAY_PAUSE_PRESS,
614                                                 SIGNAL_CONTROL_PART_PLAY_BUTTON,
615                                                 (void *)MpVideoDisplayViewPressPauseButtonCb, (void *)pAppData);
616
617                 edje_object_signal_callback_add(pDisplayViewCtrlEdj,
618                                                 SIGNAL_CONTROL_PLAY_RESUME_PRESS,
619                                                 SIGNAL_CONTROL_PART_PLAY_BUTTON,
620                                                 (void *)MpVideoDisplayViewPressResumeButtonCb, (void *)pAppData);
621
622                 edje_object_signal_callback_add(pDisplayViewCtrlEdj,
623                                                 SIGNAL_CONTROL_NORMAL_FF_BUTTON_DOWN,
624                                                 SIGNAL_CONTROL_PART_FF_BUTTON,
625                                                 (void *)MpVideoDisplayViewFFDownButtonCb, (void *)pAppData);
626
627                 edje_object_signal_callback_add(pDisplayViewCtrlEdj,
628                                                 SIGNAL_CONTROL_NORMAL_FF_BUTTON_UP,
629                                                 SIGNAL_CONTROL_PART_FF_BUTTON,
630                                                 (void *)MpVideoDisplayViewFFUpButtonCb, (void *)pAppData);
631
632                 edje_object_signal_callback_add(pDisplayViewCtrlEdj,
633                                                 SIGNAL_CONTROL_NORMAL_REW_BUTTON_DOWN,
634                                                 SIGNAL_CONTROL_PART_REW_BUTTON,
635                                                 (void *)MpVideoDisplayViewRewDownButtonCb, (void *)pAppData);
636
637                 edje_object_signal_callback_add(pDisplayViewCtrlEdj,
638                                                 SIGNAL_CONTROL_NORMAL_REW_BUTTON_UP,
639                                                 SIGNAL_CONTROL_PART_REW_BUTTON,
640                                                 (void *)MpVideoDisplayViewRewUpButtonCb, (void *)pAppData);
641
642                 edje_object_signal_callback_add(pDisplayViewCtrlEdj,
643                                                 SIGNAL_CONTROL_BACK_BUTTON_DOWN,
644                                                 SIGNAL_CONTROL_PART_BACK_BUTTON,
645                                                 (void *)MpVideoDisplayViewBackButtonDownCb, (void *)pAppData);
646
647                 edje_object_signal_callback_add(pDisplayViewCtrlEdj,
648                                                 SIGNAL_CONTROL_VOL_BUTTON_DOWN,
649                                                 SIGNAL_CONTROL_PART_VOL_BUTTON,
650                                                 (void *)MpVideoDisplayViewVolumeButtonDownCb, (void *)pAppData);
651
652                 edje_object_signal_callback_add(pDisplayViewCtrlEdj,
653                                                 SIGNAL_CONTROL_VOL_BUTTON_UP,
654                                                 SIGNAL_CONTROL_PART_VOL_BUTTON,
655                                                 (void *)MpVideoDisplayViewVolumeButtonUpCb, (void *)pAppData);
656
657                 MpUtilRegisteEarjackCbFunc((void *)MpVideoDisplayViewChangedEarjackCb, pUserData);
658         }
659 }
660
661 void MpVideoDisplayViewInit(void *pUserData, int nPlayerType)
662 {
663         VideoLogInfo("");
664
665         if (!pNaviFrameHandle|| !pUserData) {
666                 VideoLogInfo("[ERR]");
667                 return;
668         }
669
670         MpVideoDisplayViewInitLayout(pUserData, nPlayerType);
671 }
672
673
674 /*
675  * External function
676  */
677 void MpVideoDisplayViewPush(void *pNaviFrame, int nPlayerType, void *pUserData, ChangeDisplayViewCbFunc pChangeViewCb)
678 {
679         if (!pNaviFrame || !pUserData) {
680                 VideoLogInfo("[ERR]");
681                 return;
682         }
683
684         VideoLogInfo("");
685
686         pNaviFrameHandle = pNaviFrame;
687         pChangeViewUserCbFunc = pChangeViewCb;
688
689         MpVideoDisplayViewInit(pUserData, nPlayerType);
690         pNaviFrameItemForDisplayerView = elm_naviframe_item_push(pNaviFrameHandle, NULL, NULL, NULL, pDisplayViewLayout, "video/1line");
691
692         if(MpVideoSoundpathIsConnectOtherSoundpath())
693         {
694                 pDisplaySoundpathButton = MpUtilCreateButtonIcon(pNaviFrameHandle, VIDEO_HEAD_ICON_SOUNDPATH, FALSE, FALSE, 1, 1, pUserData, "video/naviframe/title/default", (void*)MpVideoDisplayViewSoundPathCb);
695                 elm_object_item_part_content_set(pNaviFrameItemForDisplayerView, "title_right_btn", pDisplaySoundpathButton);
696         }
697
698         MpVideoDisplayViewShowControlPanel(pUserData);
699 }
700
701 void MpVideoDisplayViewPop(void *pNaviFrame, void *pUserData)
702 {
703         if(!pUserData)
704         {
705                 VideoLogInfo("[ERR]");
706                 return;
707         }
708
709         VideoLogInfo("");
710
711         VideoAppData *pAppData = (VideoAppData *)pUserData;
712
713         int nTmpPlayerType = MpVideoServiceCtrlGetPlayerType();
714         if(nTmpPlayerType == MP_VIDEO_PLAYER ||
715                 nTmpPlayerType == MP_VIDEO_PLAYER_SIMPLE ||
716                 nTmpPlayerType == MP_VIDEO_PLAYER_GALLERY ||
717                 nTmpPlayerType == MP_VIDEO_PLAYER_EMAIL||
718                 nTmpPlayerType == MP_VIDEO_PLAYER_MMS)
719         {
720                 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData);
721         }
722 }
723
724 void MpVideoDisplayViewDestroy(void *pUserData)
725 {
726         VideoLogInfo("");
727
728         MpVideoDisplayViewHideControlPanel(pUserData);
729         MpVideoProgressbarDestroy();
730
731         pNaviFrameHandle = NULL;
732         pDisplayViewProgressbarEdj = NULL;
733
734         if (pDisplayViewPanelEdj) {
735                 evas_object_del(pDisplayViewPanelEdj);
736                 pDisplayViewPanelEdj = NULL;
737         }
738
739         if (pDisplayViewCtrlEdj) {
740                 evas_object_del(pDisplayViewCtrlEdj);
741                 pDisplayViewCtrlEdj = NULL;
742         }
743
744         if (pSpeedPressTimer) {
745                 ecore_timer_del(pSpeedPressTimer);
746                 pSpeedPressTimer = NULL;
747         }
748
749         if (pCtrlPanelHideTimer) {
750                 ecore_timer_del(pCtrlPanelHideTimer);
751                 pCtrlPanelHideTimer = NULL;
752         }
753
754         if (pDisplayViewLayout) {
755                 evas_object_del(pDisplayViewLayout);
756                 pDisplayViewLayout = NULL;
757         }
758
759         if (pDisplaySoundpathButton) {
760                 evas_object_del(pDisplaySoundpathButton);
761                 pDisplaySoundpathButton = NULL;
762         }
763
764         bIsVideoViewScreenLock = FALSE;
765
766         bSwitchDisplayViewUI = TRUE;
767         nDisplayViewState = MP_DISPLAY_VIEW_STATE_UNACTIVATE;
768         nScreensizeStatus = MP_DISPLAY_METHOD_LETTER_BOX;
769         bIsDisplayViewOnlyAudio = FALSE;
770         bIsPauseByUser = FALSE;
771 }
772
773 void MpVideoDisplayViewInitAfterBeginOfStream(void *pUserData)
774 {
775         VideoLogInfo("");
776
777         if (!pUserData) {
778                 VideoLogInfo("[ERR]");
779                 return;
780         }
781
782         VideoAppData *pAppData = (VideoAppData *)pUserData;
783
784         MpVideoProgressbarBeginOfStream((void *)pAppData);
785
786         if (pAppData->nDuration > 1) {
787                 char szDurationTime[PLAY_TIME_LENGTH] = { 0 };
788
789                 snprintf(szDurationTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, PLAY_TIME_ARGS(pAppData->nDuration / 1000));
790
791                 MpVideoProgressbarUpdateDurationTime(szDurationTime);
792         }
793
794         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlShowLayout(pAppData);
795
796         if(MpVideoDisplayViewIsPauseByUser() == FALSE)
797         {
798                 edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_PLAY_RESUME, "*");
799         }
800 }
801
802 void MpVideoDisplayViewUpdatePauseKey(void)
803 {
804         VideoLogInfo("");
805
806         edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_PLAY_PAUSE, "*");
807 }
808
809 void MpVideoDisplayViewUpdateResumeKey(void)
810 {
811         VideoLogInfo("");
812
813         edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_PLAY_RESUME, "*");
814 }
815
816 void MpVideoDisplayViewShowControlPanel(void *pUserData)
817 {
818         VideoLogInfo("");
819
820         if (!pUserData) {
821                 VideoLogInfo("[ERR]");
822                 return;
823         }
824
825         if (!pDisplayViewPanelEdj) {
826                 VideoLogInfo("No exist play control panel edc.");
827                 return;
828         }
829
830         if (nDisplayViewState == MP_DISPLAY_VIEW_STATE_UNACTIVATE) {
831                 VideoLogInfo("MP_DISPLAY_VIEW_STATE_UNACTIVATE");
832                 return;
833         }
834
835         VideoAppData *pAppData = (VideoAppData *)pUserData;
836         MpVideoProgressbarCreateTimer((void *)pAppData);
837
838         bSwitchDisplayViewUI = TRUE;
839         evas_object_show(pDisplayViewLayout);
840
841         if (pCtrlPanelHideTimer) {
842                 ecore_timer_del(pCtrlPanelHideTimer);
843                 pCtrlPanelHideTimer = NULL;
844         }
845
846         VideoLogInfo("");
847
848         if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PAUSE || bIsDisplayViewOnlyAudio == TRUE) {
849                 VideoLogInfo("");
850         } else {
851                 VideoLogInfo("");
852                 pCtrlPanelHideTimer = ecore_timer_add(CTRL_PANEL_SHOW_TIME, MpVideoDisplayViewCtrlPanelHideCb, pUserData);
853         }
854
855         MpVideoDisplayViewActivate();
856         MpVideoDisplayViewUnlockScreen(pUserData);
857 }
858
859 void MpVideoDisplayViewHideControlPanel(void *pUserData)
860 {
861         VideoLogInfo("");
862
863         if (!pUserData) {
864                 VideoLogInfo("[ERR]");
865                 return;
866         }
867
868         if (nDisplayViewState == MP_DISPLAY_VIEW_STATE_UNACTIVATE) {
869                 VideoLogInfo("MP_DISPLAY_VIEW_STATE_UNACTIVATE");
870                 return;
871         }
872
873         if (!pDisplayViewPanelEdj) {
874                 VideoLogInfo("No exist play control panel edc.");
875                 return;
876         }
877
878         if(bIsDisplayViewOnlyAudio)
879         {
880                 VideoLogInfo("Not hide control panel and UI because of audio only.");
881                 return;
882         }
883
884         bSwitchDisplayViewUI = FALSE;
885
886         evas_object_hide(pDisplayViewLayout);
887
888         MpVideoProgressbarDeleteTimer();
889         MpExternalUgHide();
890         if (pCtrlPanelHideTimer) {
891                 ecore_timer_del(pCtrlPanelHideTimer);
892                 pCtrlPanelHideTimer = NULL;
893         }
894 }
895
896 void MpVideoDisplayViewActivate(void)
897 {
898         VideoLogInfo("");
899
900         nDisplayViewState = MP_DISPLAY_VIEW_STATE_ACTIVATE;
901 }
902
903 void MpVideoDisplayViewUnactivate(void)
904 {
905         VideoLogInfo("");
906
907         nDisplayViewState = MP_DISPLAY_VIEW_STATE_UNACTIVATE;
908 }
909
910
911 void MpVideoDisplayViewHideSoundpath(void)
912 {
913         VideoLogInfo("");
914
915         MpVideoSoundpathHide();
916 }
917
918 void MpVideoDisplayViewChangeNaviFrameTitle(void *pUserData)
919 {
920         VideoLogInfo("");
921
922         if (!pUserData) {
923                 VideoLogInfo("[ERR]");
924                 return;
925         }
926
927         VideoAppData *pAppData = (VideoAppData *)pUserData;
928
929         Elm_Object_Item *pNaviFrameItemForDisplayerView = elm_naviframe_top_item_get(pNaviFrameHandle);
930
931         if (pNaviFrameItemForDisplayerView != NULL) {
932                 VideoLogInfo("%s", pAppData->szVideoTitle);
933                 elm_object_item_text_set(pNaviFrameItemForDisplayerView, pAppData->szVideoTitle);
934         }
935 }
936
937 bool MpVideoDisplayViewIsTopView(void)
938 {
939         VideoLogInfo("");
940
941         Evas_Object *pTmpContents = NULL;
942         Elm_Object_Item *pTmpItem = NULL;
943
944         if (!pNaviFrameHandle) {
945                 VideoLogInfo("[ERR] No exist navigationbar handle.");
946                 return FALSE;
947         }
948
949         pTmpItem = elm_naviframe_top_item_get(pNaviFrameHandle);
950         pTmpContents = elm_object_item_content_get(pTmpItem);
951         if (pTmpContents) {
952                 if (pTmpContents == pDisplayViewLayout) {
953                         VideoLogInfo("Video display view is staing in top view.");
954                         return TRUE;
955                 } else {
956                         VideoLogInfo("Video display view is not staied in top view.");
957                         return FALSE;
958                 }
959         } else {
960                 VideoLogInfo("[ERR] No exist navigationbar top item.");
961                 return FALSE;
962         }
963
964         return FALSE;
965 }
966
967 void MpVideoDisplayViewShowNocontentImage(void *pUserData)
968 {
969         VideoLogInfo("");
970
971         if (pDisplayViewLayout) {
972                 edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_NOCONTENTS_SHOW, "*");
973         }
974
975         bIsDisplayViewOnlyAudio = TRUE;
976
977         MpVideoDisplayViewShowControlPanel(pUserData);
978 }
979
980 void MpVideoDisplayViewHideNocontentImage(void)
981 {
982         VideoLogInfo("");
983
984         if (pDisplayViewLayout) {
985                 edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_NOCONTENTS_HIDE, "*");
986         }
987
988         bIsDisplayViewOnlyAudio = FALSE;
989 }
990
991 void MpVideoDisplayViewPortrate(void)
992 {
993         VideoLogInfo("");
994
995         elm_object_item_signal_emit(pNaviFrameItemForDisplayerView, SIGNAL_NAVIFRAME_PORTRATE_MODE, "*");
996         edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_PORTRATE_MODE, "*");
997         edje_object_signal_emit(pDisplayViewPanelEdj, SIGNAL_PANEL_PORTRATE_MODE, "*");
998         edje_object_signal_emit(pDisplayViewProgressbarEdj, SIGNAL_PROGRESS_PORTRATE_MODE, "*");
999         edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_PORTRATE_MODE, "*");
1000 }
1001
1002 void MpVideoDisplayViewLandscape(void)
1003 {
1004         VideoLogInfo("");
1005
1006         elm_object_item_signal_emit(pNaviFrameItemForDisplayerView, SIGNAL_NAVIFRAME_LANDSCAPE_MODE, "*");
1007         edje_object_signal_emit(_EDJ(pDisplayViewLayout), SIGNAL_MAIN_LANDSCAPE_MODE, "*");
1008         edje_object_signal_emit(pDisplayViewPanelEdj, SIGNAL_PANEL_LANDSCAPE_MODE, "*");
1009         edje_object_signal_emit(pDisplayViewProgressbarEdj, SIGNAL_PROGRESS_LANDSCAPE_MODE, "*");
1010         edje_object_signal_emit(pDisplayViewCtrlEdj, SIGNAL_CONTROL_LANDSCAPE_MODE, "*");
1011 }
1012
1013 void MpVideoDisplayViewResetProgressBar(void *pUserData)
1014 {
1015         VideoLogInfo("");
1016
1017         if (pDisplayViewLayout) {
1018                 MpVideoProgressbarReset(pUserData);
1019         }
1020 }
1021
1022 void MpVideoDisplayViewLockScreen(void *pUserData)
1023 {
1024         VideoLogInfo("");
1025
1026         VideoAppData *pAppData = (VideoAppData *)pUserData;
1027
1028         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlHideLayout(pAppData);
1029
1030         bIsVideoViewScreenLock = TRUE;
1031 }
1032
1033 void MpVideoDisplayViewUnlockScreen(void *pUserData)
1034 {
1035         VideoLogInfo("");
1036
1037         bIsVideoViewScreenLock = FALSE;
1038 }
1039
1040 bool MpVideoDisplayViewGetScreenLockState(void)
1041 {
1042         VideoLogInfo("");
1043
1044         return bIsVideoViewScreenLock;
1045 }
1046
1047 int MpVideoDisplayViewGetScreenSize(void)
1048 {
1049         VideoLogInfo("");
1050
1051         return nScreensizeStatus;
1052 }
1053
1054 bool MpVideoDisplayViewIsPauseByUser(void)
1055 {
1056         VideoLogInfo("%d", bIsPauseByUser);
1057
1058         return bIsPauseByUser;
1059 }
1060
1061 void MpVideoDisplayViewUpdateProgressBar(void *pUserData)
1062 {
1063         VideoLogInfo("");
1064
1065         if (!pUserData) {
1066                 VideoLogInfo("[ERR]");
1067                 return;
1068         }
1069
1070         MpVideoProgressbarCreateTimer(pUserData);
1071 }